通过散点图上的垂直堆叠点绘制线段

时间:2016-03-12 02:52:26

标签: r ggplot2

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

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)

example plot

我想通过每组堆叠点绘制颜色匹配的垂直线段,但只能通过这些点。在这种情况下,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时发生的情况:

size=1

如何控制所有点的大小?

2 个答案:

答案 0 :(得分:2)

geom_segment可以执行此操作,但您需要选择要绘制线段的点,因为geom_segment具有许多必需的美学(x,{{1 },yxend)。在绘图之前这样做最容易,在这种情况下,为此目的制作单独的data.frame是最简单的。有很多方法可以制作这样的data.frame,但是使用base R,你可以做类似

的事情
yend

这有点复杂,但是如果你对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

产生的情节如下:

plot with segments from max to min

或者,如果您想要更多的矩形外观,您可以使用类似的方法(当然,您也可以使用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

哪些情节

plot with wide transparent segments

答案 1 :(得分: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()

enter image description here