【问题标题】:Using ggplot to plot line segments and points together使用 ggplot 将线段和点绘制在一起
【发布时间】:2019-02-03 19:34:13
【问题描述】:

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

这是我在这个例子中使用的数据:

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

我收到以下错误:

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

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

问题在于,当单独列出构成音高的每个形状(每个线段或圆的额外层),然后将 x、y 数据添加为点时,它需要 永远 用于渲染的情节。

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

谢谢!

【问题讨论】:

  • 也许这个包能帮上忙? github.com/Torvaney/ggsoccer
  • geom_segment 如果您这样提供它们,则只会采用单个数据条目。相反,将它们放在 data.frame 中并将 data.frame 传递给geom_segment。确保您的 aes 将正确的列映射到 x y xendyend。这确实应该使事情至少更快一点,并且你的代码更简单一点。祝你好运。 (感谢您提出非常明确的问题!)
  • @Axeman - 谢谢。所以你的意思是将所有 4 个向量(x,xend,y,yend)放入一个 df,然后将 df 对象传递给 geom_segment(aes(df)) ?
  • 请学习?geom_segment中的第一个例子。另请阅读?ggplot
  • 不,每个 geom 都有一个数据参数。这就是 data.frame 所在的位置。 Aes 指的是该数据中的列。

标签: r ggplot2 data-visualization


【解决方案1】:

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 如果我的回答有帮助,请随时将此问题标记为已解决。
  • 你明白了!抱歉,仍然遵守礼仪。
猜你喜欢
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
相关资源
最近更新 更多