我想要实现的目标是:手动添加形状(在我的实际项目中是足球场地的线和圆形)到散点图中。这是我的实际项目的缩小版,但说明了我需要帮助解决的问题。
这是我在此示例中使用的数据:
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数据作为点添加时,绘图需要很长时间。
希望能提供帮助,避免使用向量绘制形状图层时出现错误,或者提供其他创造性的解决方案。我的主要目标是使这个包含许多形状和许多数据点的图表更快地呈现(拥有更优雅的代码也是一个不错的奖励)。
谢谢!
geom_segment
只会采用单个数据项。相反,将它们放入一个数据框中,并将数据框传递给geom_segment
。确保您的aes
将正确的列映射到x
、y
、xend
和yend
。这应该至少使事情变得更快一些,使您的代码更简单明了。祝好运。(感谢您提供一个非常清晰的问题!) - Axeman?geom_segment
中的第一个示例。同时阅读?ggplot
。 - Henrik