使用ggplot将线段和点绘制在一起

时间:2018-08-29 05:44:25

标签: r ggplot2 data-visualization

我要完成的工作:在散点图中手动添加形状(在我的实际项目中,用于足球场的直线和圆)。这是我实际项目的缩小示例,但说明了我需要帮助的问题。

这是我用于此示例的数据:

data <- data.frame("name" = c("A", "A", "B", "B", "C", "C"),
                     "x" = c(.13, .64, .82, .39, .51, .03),
                     "y" = c(.62, .94, .10, .24, .20, .84))

我将提供示例代码,首先提供一种可行的方式(乏味,太长),然后提供一种我无法弄清楚的方式(这似乎更高效/简洁,而且可能……更快< / em>?)。

library(ggplot2)

ggplot(data, aes(x, y)) +
  geom_point() +
  geom_segment(aes(x = 0,xend = 1,y = 1,yend = 1)) +
  geom_segment(aes(x = 0, xend = 1, y=0,yend=0)) +
  geom_segment(aes(x=1, xend=1, y=0, yend=1)) +
  geom_segment(aes(x=0, xend=0, y=0, yend=1))

Example plot of player position on 1x1 soccer pitch

这为我提供了一个不错的1x1间距,其中包含6个数据点(不要以为我可以嵌入剧情,因为我没有足够的声誉)。由于我的实际项目有更多的数据点以及构成间距的更多“形状”(线段,圆和圆弧),所以我认为最好使用矢量来定义geom_segment的美感-完整的数据集会非常缓慢地绘制非常。这就是我所拥有的:

ggplot(data, aes(x, y)) +
  geom_point() +
  geom_segment(aes(x = c(0,0,1,0),
               xend = c(1,1,1,0),
               y = c(1,0,0,0),
               yend = c(1,0,1,1)))

我收到以下错误:

Error: Aesthetics must be either length 1 or the same as the data (16): x, y, xend, yend

我已经尝试过在geom_segment中使用Inherited.aes = FALSE来更改我调用aes()的图层,但仍然会出现该错误。我对R比较陌生,对SO非常陌生,因此如果在发布此问题时使用任何不正确的术语或协议,我深表歉意。

问题是,当列出每个单独组成间距的形状(每个线段或圆的额外层),然后将x,y数据作为点相加时,它将永远使用 用于渲染图。

在使用矢量绘制形状图层时,任何有助于避免该错误的方法,否则任何其他创造性的解决方案都将非常有用。我的主要目标是使这种具有多种形状和数据点的图形更快地呈现(具有更优雅的代码也将是一个不错的选择)。

谢谢!

1 个答案:

答案 0 :(得分:6)

Axeman想要说的是,用段写入和写入额外的数据帧,然后通过geom_segment参数将其加载到data函数中。如果这样做,它将不使用提供给ggplot函数的标准数据,而是将使用其自身的数据。

类似

data <- data.frame("name" = c("A", "A", "B", "B", "C", "C"),
                   "x" = c(.13, .64, .82, .39, .51, .03),
                   "y" = c(.62, .94, .10, .24, .20, .84))

seg_df <- data.frame(x=c(0,0,1,0),
                     y=c(1,0,0,0),
                     xend=c(1,1,1,0),
                     yend=c(1,0,1,1))

ggplot(data, aes(x, y)) +
  geom_point() +
  geom_segment(data=seg_df, aes(x, y, xend=xend, yend=yend))