Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 通过散点图上的垂直堆叠点绘制线段_R_Ggplot2 - Fatal编程技术网

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)