【问题标题】:Draw line segments through vertically stacked points on a scatter plot通过散点图上的垂直堆叠点绘制线段
【发布时间】:2016-04-04 21:42:41
【问题描述】:

我有一个相当大的数据集,与以下示例非常相似:

a <-data.frame(x=sort(c(replicate(4,c(1:4,5:8,9:12,13:16,17:20,21:25)))),y=c(rnorm(100)),z=c(replicate(20,"a"),replicate(20,"b"),replicate(20,"c"),replicate(20,"d"),replicate(20,"e")))

# install and enable ggplot2, if necessary
# install.packages('ggplot2') 
library(ggplot2)

ggplot(a, aes(x=x, y=y, col=z)) + geom_point(size=3)

我想通过每组堆叠点绘制颜色匹配的垂直线段,但只能通过点。在这种情况下, abline() 不会成功。我怀疑需要使用segments() 或lines(),但我不知道如何在不手动输入每个起点/终点的情况下自动执行此过程。

更新

重新审视最终的代码:

a <-data.frame(x=sort(c(replicate(4,c(1:4,5:8,9:12,13:16,17:20,21:24)))),y=c(rnorm(96)),z=c(replicate(24,"a"),replicate(24,"b"),replicate(24,"c"),replicate(24,"d")))

ggplot(a, aes(x=x, y=y, col=z)) + 
geom_point(size=3) +
stat_summary(aes(color=z), fun.ymin = min, fun.ymax = max, fun.y = max, show.legend = F)

当我将磅值更改为 1 时会发生以下情况:

如何控制所有点的大小?

【问题讨论】:

  • 是的,就在最外(上/下)点之间。

标签: r ggplot2


【解决方案1】:

你可以使用stat_summary(不知道为什么必须使用fun.y

ggplot(a, aes(x=x, y=y, col=z)) + 
  geom_point(size=3) +
  stat_summary(fun.ymin = min, fun.ymax = max,
               aes(colour=z),
               fun.y = max)

如果您希望图例仅显示点,您可以将 show.legend=F 添加到 stat_summary()

【讨论】:

【解决方案2】:

geom_segment 可以做到这一点,但是您需要选择要在其之间绘制线段的点,因为geom_segment 有很多必需的美学(xyxend、@ 987654328@)。在绘图之前这样做是最简单的,在这种情况下,为此目的制作一个单独的 data.frame 是最简单的。有很多方法可以制作这样的 data.frame,但是使用 base R,你可以做类似的事情

maxes <- do.call(rbind, lapply(split(a, a$z), function(s){s[which.max(s$y),]}))
mins <- do.call(rbind, lapply(split(a, a$z), function(s){s[which.min(s$y),]}))
names(maxes) <- paste0(names(maxes), '_max')
names(mins) <- paste0(names(mins), '_min')
mm <- cbind(maxes, mins)

这有点复杂,但如果您对lapply 感到满意,那就不可怕了。如果你喜欢dplyr,你也可以这样做

library(dplyr)
maxes <- a %>% group_by(z) %>% slice(which.max(y))
mins <- a %>% group_by(z) %>% slice(which.min(y))
names(maxes) <- paste0(names(maxes), '_max')
names(mins) <- paste0(names(mins), '_min')
mm <- bind_cols(maxes, mins)

这也许更直观。不管怎样,现在我们可以使用mm,看起来像

  x_max    y_max z_max x_min     y_min z_min
1     4 1.212553     a     5 -2.582079     a
2     8 2.695793     b     8 -1.642280     b
3    11 1.980166     c    14 -1.526656     c
4    18 1.497085     d    20 -2.131925     d
5    23 1.867731     e    24 -1.260946     e

我们可以用它来绘制geom_segment

ggplot(a, aes(x=x, y=y, col=z)) + geom_point(size=3) + 
  geom_segment(aes(x=x_max, y=y_max, xend=x_min, yend=y_min, col = z_max), data = mm)

产生的情节如下所示:


或者,如果您想要更多的矩形外观,您可以使用类似的方法(当然,您也可以使用geom_rect 或类似的方法):

segs <- data.frame(x = seq(2.5, 22.5, by = 5), 
                   ymax = tapply(a$y, a$z, max), 
                   ymin = tapply(a$y, a$z, min),
                   z = levels(a$z))

ggplot(a, aes(x=x, y=y, col=z)) + geom_point(size=3) + 
  geom_segment(aes(x = x, y = ymax, xend = x, yend = ymin, 
                   col = z), alpha = 0.3, size = 33, data = segs, show.legend = FALSE)

哪些地块

【讨论】:

  • 那些矩形地块区域很漂亮!我可以想到很多用途。感谢分享!
  • geom_pointstat_summary 大小点由于某种原因不同。好消息是,如果您使用fun.y = identity,则不需要geom_point,它告诉stat_summary 绘制所有点。大家一起:ggplot(a, aes(x = x, y = y, colour = z)) + stat_summary(fun.ymin = min, fun.ymax = max, fun.y = identity, size = .1)
  • 最优雅的解决方案!兄弟,非常感谢您的帮助!我正在疯狂地争取截止日期,而你真的通过了......
猜你喜欢
  • 1970-01-01
  • 2022-07-28
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
相关资源
最近更新 更多