Подтвердить что ты не робот

Можно ли рисовать диаграммы в R?

Мне было интересно, есть ли какой-либо пакет в R, который мог бы использовать координаты x, y и размеры формы, чтобы сделать что-то вроде этого:

enter image description here

У меня есть координаты передних центров транспортных средств и их размеры (длина и ширина).

Изменить

Вот что выглядит исходный набор данных:

> head(df)
  Vehicle.ID Frame.ID Global.X Global.Y Vehicle.Length Vehicle.width Lane Preceding.Vehicle.ID Following.Vehicle.ID Spacing Headway
1          2       43  6451214  1873261           14.5           4.9    2                    0                   13       0       0
2          2       44  6451217  1873258           14.5           4.9    2                    0                   13       0       0
3          2       45  6451220  1873256           14.5           4.9    2                    0                   13       0       0
4          2       46  6451223  1873253           14.5           4.9    2                    0                   13       0       0
5          2       47  6451225  1873250           14.5           4.9    2                    0                   13       0       0
6          2       48  6451228  1873247           14.5           4.9    2                    0                   13       0       0

Для любого заданного кадра я хочу визуализировать пробелы, например, для кадра. 500:

ff <- subset(df, Frame.ID==500)
qplot(x=Global.X, y=Global.Y, data=ff)

enter image description here

Все эти точки - это центральные координаты транспортных средств. Я не знаю, как отображать длину и ширину каждого автомобиля и маркировать значения разрыва.

4b9b3361

Ответ 1

Итак, я не защищаю вас, полагаясь на ggplot, чтобы сделать это, поскольку, скорее всего, некоторые из других предлагаемых решений лучше, но эта проблема заинтересовала меня, поскольку я имел в виду выкапывать кишки ggplot на некоторое время. Это то, что мне удалось придумать:

ggplot(df, aes(x=x, y=y, length=length, width=width)) + 
  geom_hline(yintercept=seq(5, 35, by=10), color="white", size=2, linetype=2) +
  geom_car() + 
  geom_text(aes(label=label, color=label), fontface=10, hjust=-0.2) +
  coord_equal() +
  theme(panel.background = element_rect(fill="#555555"), 
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank())

enter image description here

Вам нужно будет найти стрелки, хотя я думаю, что это просто с geom_segment. Теперь для этого нам нужно было создать geom_car, хотя, если вам не нужны подробные изображения, вы можете просто использовать geom_rect. Здесь geom_car:

library(png)
library(ggplot2)
library(proto)
car.raster <- readPNG("data/car.png")

carGrob <- function(x, y, length, width) {  
  rasterGrob(
    car.raster, x=x, y=y, 
    hjust=1, height=width, width=length
  )
}
GeomCar <- proto(ggplot2:::Geom, {
  draw <- function(., data, scales, coordinates, ...) {
    with(
      coord_transform(coordinates, data, scales), 
      carGrob(x, y, xmax-xmin, ymax-ymin)
    )    
  }  
  draw_legend <- function(., data, ...) {
    with(data, ggname(.$my_name(), fieldGrob(1, 0.5, )))
  }
  reparameterise <- function(., df, params) {
    transform(df,
      xmin = x - length / 2, xmax = x + length / 2, length = NULL,
      ymin = y - width / 2, ymax = y + width / 2, width = NULL
    )
  }
  objname <- "car" # name of the geom in lowercase. Must correspond to GeomField.
  desc <- "A car!"

  default_stat <- function(.) StatIdentity
  required_aes <- c("x", "y") 
  guide_geom <- function(.) "car"
  default_aes <- function(.) aes()
} )
geom_car <- function(mapping=NULL, data=NULL) {
  GeomCar$new(mapping=mapping, data=data)
}

И сам автомобиль:

enter image description here

И данные, которые я использовал:

df <- read.table(h=T, t="vehicle  x y   length  width   label
1   150 10  14  5   other
2   180 8   12  5   other
3   220 10  18  5   other
4   145 20  15  5   target
5   250 18  14  5   other
6   160 30  13  5   other
7   200 33  15  5   other
8   240 31  22  5   other
")