2016-03-12 186 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