使用ggplot绘制线段和点

9

我想要实现的目标是:手动添加形状(在我的实际项目中是足球场地的线和圆形)到散点图中。这是我的实际项目的缩小版,但说明了我需要帮助解决的问题。

这是我在此示例中使用的数据:

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

我将提供示例代码,首先是一种行之有效但太长的方式,然后是一种我无法想出的方法(似乎更高效/简洁,可能也更...?)。

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

球场上球员位置的示例图

这个图展示了一个漂亮的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)))

I get the following error:

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

我尝试更改调用aes()的图层,使用geom_segment中的inherit.aes = FALSE,但仍然出现错误。我对R相对较新,并且对SO非常陌生,如果在发布此问题时使用任何不正确的术语或协议,请谅解。
问题在于当单独列出构成画面的每个形状(每个线段或圆的额外层),并将x,y数据作为点添加时,绘图需要很长时间。
希望能提供帮助,避免使用向量绘制形状图层时出现错误,或者提供其他创造性的解决方案。我的主要目标是使这个包含许多形状和许多数据点的图表更快地呈现(拥有更优雅的代码也是一个不错的奖励)。
谢谢!

5
这个包或许可以帮到你?https://github.com/Torvaney/ggsoccer - neilfws
4
如果像那样单独给出数据项,geom_segment 只会采用单个数据项。相反,将它们放入一个数据框中,并将数据框传递给 geom_segment。确保您的 aes 将正确的列映射到 xyxendyend。这应该至少使事情变得更快一些,使您的代码更简单明了。祝好运。(感谢您提供一个非常清晰的问题!) - Axeman
@Axeman - 谢谢。所以你的意思是将所有4个向量(x,xend,y,yend)放入一个数据框中,然后将数据框对象传递到geom_segment(aes(df))中? - ForceLeft415
2
请仔细研究?geom_segment中的第一个示例。同时阅读?ggplot - Henrik
1
不,每个geom都有一个数据参数。那就是data.frame所在的位置。Aes是指该数据中的列。 - Axeman
谢谢@Axeman!感谢您的解释。 - ForceLeft415
1个回答

8
Axeman 的意思是,用你的片段编写一个额外的数据框,并通过 data 参数将其加载到 geom_segment 函数中。如果这样做,它就不会使用提供给 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))

你们太棒了。感谢你们的帮助和清晰的解释。 - ForceLeft415
如果我的回答对@ForceLeft415有所帮助,请随意将此问题标记为已解决。 - drmariod
你懂了!抱歉,我还在学习 Stack Overflow 的礼仪。 - ForceLeft415

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接