我有一个相当大的数据集,与以下示例非常相似:
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时发生的情况:
如何控制所有点的大小?
答案 0 :(得分:2)
geom_segment
可以执行此操作,但您需要选择要绘制线段的点,因为geom_segment
具有许多必需的美学(x
,{{1 },y
,xend
)。在绘图之前这样做最容易,在这种情况下,为此目的制作单独的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
产生的情节如下:
或者,如果您想要更多的矩形外观,您可以使用类似的方法(当然,您也可以使用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
哪些情节
答案 1 :(得分:1)