R 通过散点图上的垂直堆叠点绘制线段
我有一个相当大的数据集,与下面的示例非常相似:R 通过散点图上的垂直堆叠点绘制线段,r,ggplot2,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 nece
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)
a您可以使用stat\u summary
(不确定为什么需要使用fun.y
)
如果希望图例仅显示点,可以将show.legend=F
添加到stat\u summary()
geom_段
可以做到这一点,但您需要选择要绘制段的点,因为geom_段
具有许多必需的美学(x
,y
,xend
,yend
)。在打印之前最容易做到这一点,在本例中,最简单的方法是为此制作一个单独的data.frame。有很多方法可以制作这样的data.frame,但是使用BaseR,您可以执行以下操作
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)
这也许更直观。无论哪种方式,现在我们都可以使用
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_段
:
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\u rect
或类似的方法):
segs是的,就在最外层(上/下)点之间。非常感谢您的回复!真是太棒了!下面是实际数据的快速呈现:[链接]这些矩形绘图区域非常漂亮!我能想到它的很多用途。谢谢分享<代码>几何点
和统计摘要
由于某些原因,点的大小不同。好消息是,如果您使用fun.y=identity
,则不需要geom\u point
,它告诉stat\u summary
绘制所有点。总之:ggplot(a,aes(x=x,y=y,color=z))+stat_摘要(fun.ymin=min,fun.ymax=max,fun.y=identity,size=0.1)
一个最优雅的解决方案!兄弟,我非常感谢你的帮助!我拼命想定一个最后期限,你真的成功了。。。
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)
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
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)
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)