我要完成的工作:在散点图中手动添加形状(在我的实际项目中,用于足球场的直线和圆)。这是我实际项目的缩小示例,但说明了我需要帮助的问题。
这是我用于此示例的数据:
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))
这为我提供了一个不错的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数据作为点相加时,它将永远使用 用于渲染图。
在使用矢量绘制形状图层时,任何有助于避免该错误的方法,否则任何其他创造性的解决方案都将非常有用。我的主要目标是使这种具有多种形状和数据点的图形更快地呈现(具有更优雅的代码也将是一个不错的选择)。
谢谢!
答案 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))