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

For*_*415 8 r data-visualization ggplot2

我想要完成的任务:手动添加形状(足球场上的线条和圆圈,在我的实际项目中)到散点图.这是我实际项目的缩小示例,但说明了我需要帮助的问题.

以下是我为此示例使用的数据:

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))
Run Code Online (Sandbox Code Playgroud)

我将提供示例代码,首先是一种工作方式(繁琐,太长),然后是一种我无法弄清楚的方法(这似乎更有效/简洁,可能...... 更快?).

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))
Run Code Online (Sandbox Code Playgroud)

1x1足球场上球员位置的示例图

这让我有一个很好的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)))
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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

我已经尝试使用geom_segment中的inherit.aes = FALSE来更改我调用aes()的层,但它仍然会给出该错误.我对R比较陌生,对SO来说很新,所以如果我在发布这个问题时使用任何不正确的术语或协议,我很抱歉.

问题在于,当单独列出构成音高的每个形状(每个单独的线段或圆圈的额外图层),然后将x,y数据添加为点时,绘制图表需要永远.

使用矢量绘制形状图层或任何其他创造性解决方案时,任何帮助避免该错误都会很棒.我的主要目标是使这个多个形状和许多数据点的绘图更快速地呈现(拥有更优雅的代码也将是一个很好的奖励).

谢谢!

drm*_*iod 7

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))
Run Code Online (Sandbox Code Playgroud)