2016-03-12 187 views
3

我有一个相当大的数据集,这是非常类似于下面的例子:绘制线段

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(),但我不知道如何在不手动输入每个开始/结束点的情况下自动执行此过程。

UPDATE

重温敲定代码:

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

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

回答

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=Fstat_summary()

enter image description here

+0

非常感谢您的答复!真的很棒!以下是实际数据的快速演绎:[link] http://i1380.photobucket.com/albums/ah165/stealing_zen/statplot_zpsmqdkfydm.png –

2

geom_segment可以做到这一点,但你需要挑选出你想要划分的部分之间的点,因为geom_segment有很多必需的aes thetics(x,y,xend,yend)。在绘图之前做这件事最简单,在这种情况下,为此目的制作一个单独的数据框是最简单的。有很多方法可以让这样的data.frame,但使用基础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) 

造成,看起来情节一样:

plot with segments from max to min


或者,如果你打算使用mor矩形外观的E,你可以使用类似的方法(尽管你可以,当然,使用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) 

图表

plot with wide transparent segments

+0

那些矩形情节地区很美!我可以想到很多用途。感谢分享! –

+0

请参阅我更新的问题! –

+1

由于某些原因,'geom_point'和'stat_summary'的大小指向不同。好消息是,如果使用'fun.y = identity',则不需要'geom_point',它会告诉'stat_summary'绘制所有点。全部一起:'ggplot(a,aes(x = x,y = y,color = z))+ stat_summary(fun.ymin = min,fun.ymax = max,fun.y = identity,size = .1) – alistaire