【问题标题】:Is it possible to draw diagrams in R?是否可以在 R 中绘制图表?
【发布时间】:2014-04-05 05:29:12
【问题描述】:

我想知道 R 中是否有任何包可以使用 x、y 坐标和形状大小来绘制如下内容:

我有车辆前部中心的坐标及其尺寸(长度和宽度)。

编辑

这是原始数据集的样子:

> 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)

所有这些点都是车辆的前中心坐标。我不知道如何显示每辆车的长度和宽度并标记间隙值。

【问题讨论】:

  • 我相信您可以,但我强烈建议您使用其他工具来完成这项工作。如果您希望它是程序化的,我的选择是 tikZ,或者如果您只需要少量图表,我会选择一些所见即所得的绘图程序。
  • 我有数千辆汽车,每辆汽车的运动(就坐标变化而言)都被记录了几个时间段。我希望能够在任何时刻(即在任何给定的帧)绘制这种类型的图表。从顶部看类似车辆的视图并不重要,简单的矩形(使用长度和宽度绘制)就可以了
  • 虽然这个任务可能会让人们觉得很有趣(这是我能想象到的唯一方法,任何人都会投票,更不用说 6 个人了),但对于目前形式的 SO,这不是一个合适的问题。在这里询问包/库推荐通常是题外话,除此之外,您还没有提供任何具体的示例数据供人们使用。如果您有特定的尝试,并提供一些您想要反馈的实际数据,那很好。否则,应该关闭它。
  • 听起来rect() 函数可能会做你想做的一切......
  • 我同意 @shujaa 并推荐像 Processing 这样的东西作为处理这类事情的更好工具。

标签: r ggplot2 diagram


【解决方案1】:

所以,我不主张您依靠 ggplot 来执行此操作,因为很可能其他一些建议的解决方案更好,但这个问题让我感兴趣,因为我一直想深入了解 @ 的胆量987654328@一会儿。这是我设法想出的:

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

您还可以使用geom_segment 添加箭头或使用geom_text 添加显式标签,但我们将其留给读者作为练习。

现在,为了让它工作,我们必须创建geom_car,但如果您不需要详细的图片,您可以使用geom_rect。这是geom_car(注意:现在也可以作为ggbg package的一部分)

# Generate a car 'grob' using a baseline PNG

car.raster <- png::readPNG("~/Downloads/car2.png")

# The `grid` grob actually responsible for rendering our car, 
# combines our transparent car elements with a background rectangle
# for color/fill.

carGrob <- function(x, y, length, width, gp) {
  grid::grobTree(
    grid::rectGrob(
      x, y, hjust=.5, height=width, width=length,
      gp = gp
    ),
    grid::rasterGrob(
      car.raster, x=x, y=y, hjust=.5, height=width, width=length
) ) }
# The `ggproto` object that maps our data to the `grid` grobs

GeomCar <- ggplot2::ggproto("GeomCar", ggplot2::Geom,
  # Generate grobs from the data, we have to reconvert length/width so
  # that the transformations persist

  draw_panel=function(self, data, panel_params, coords) {
    with(
      coords$transform(data, panel_params),
      carGrob(
        x, y, length=xmax-xmin, width=ymax-ymin,
        gp=grid::gpar(
          col = colour, fill = alpha(fill, alpha),
          lwd = size * .pt, lty = linetype, lineend = "butt"
  ) ) ) },
  # Convert data to coordinates that will get transformed (length/width don't
  # normally).

  setup_data=function(self, data, params) {
    transform(data,
      xmin = x - length / 2, xmax = x + length / 2,
      ymin = y - width / 2, ymax = y + width / 2
  ) },
  # Required and default aesthetics

  required_aes=c("x", "y", "length", "width"),
  default_aes = aes(
    colour = NA, fill = "grey35", size = 0.5, linetype = 1, alpha = NA
  ),
  # Use the car grob in the legend

  draw_key = function(data, params, size) {
    with(
      data,
      carGrob(
        0.5, 0.5, length=.75, width=.5,
        gp = grid::gpar(
          col = colour, fill = alpha(fill, alpha),
          lwd = size * .pt, lty = linetype, lineend = "butt"
  ) ) ) }
)
# External interface

geom_car <- function(
  mapping=NULL, data=NULL, ..., inherit.aes=TRUE, show.legend=NA
) {
  layer(
    data=data, mapping=mapping, geom=GeomCar, position="identity",
    stat="identity", show.legend = show.legend, inherit.aes = inherit.aes,
    params=list(...)
  )
}

汽车:

数据:

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   autonomous
7   200 33  15  5   other
8   240 31  22  5   other
")

【讨论】:

  • @BrodieG Hadley 询问他是否可以在 Twitter 上的下一本 ggplot2 书中分享这一点 twitter.com/hadleywickham/status/609456138472394752
  • @TylerRinker,感谢您的提醒;可能过了一段时间我才注意到。
  • 这很好,但它需要更多的青蛙。 :)
  • 几乎可以肯定是 Ggplot2/prooto 更改问题。发生了很多变化,尤其是如何进行扩展。恐怕我没有时间专门讨论这个问题,但也许你可以以“我如何用较新版本的 Ggplot2 复制这个答案”的形式再次问这个问题,有人会愿意尝试一下它。
  • @umairdurrani 现在应该可以使用新版本的 ggplot2。
猜你喜欢
  • 2021-12-13
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多