2016-10-15 52 views
1

我正在ggplot中繪製折線圖。每行對應於一個人及其隨着時間的發展。一個簡化的,可再現例如:ggplot:將小提琴添加到折線圖

dat <- data.frame(x=rep(1:10, 10), y=rnorm(100), person=rep(LETTERS[1:10], each=10)) 
ggplot(dat, aes(x, y, group=person)) + geom_line(aes(color=person)) 

哪個生產:

enter image description here

我想在x = 11添加一個小提琴來顯示所描繪的在y的值的總體分佈-軸。

如果我將一個+ geom_violin()添加到ggplot調用中,將在每個x的值處繪製小提琴(這是有道理的)。但是我想要的是用ggplot(dat, aes(x, y)) + geom_violin()添加小提琴。

如何將這兩個geom_ s合併到一個圖中以全面瞭解我的數據?


編輯:我得到了它與geom_errorbar工作,但不能得到類似的東西與小提琴的工作:

ggplot(dat, aes(x, y, group=person)) + geom_line(aes(color=person)) + 
    geom_errorbar(aes(x=11, ymax=mean(dat$y)+sd(dat$y), ymin=mean(dat$y)-sd(dat$y))) + 
    geom_point(aes(x=11, y=mean(dat$y)), size=4) 

,給了我這樣的:

enter image description here

理想情況下,我想要一把小提琴而不是錯誤條,以更好地反映分配情況。

回答

2

您需要使用group = 1內的aesgeom_violin的:

ggplot(dat, aes(x, y)) + 
    geom_line(aes(color = person)) + 
    geom_violin(aes(group = 1), fill = NA, size = 1.5) + 
    theme_minimal() 

這給:

enter image description here

要繪製的小提琴旁邊的線圖,你可以利用grid.arrange來自gridExtra包:

p1 <- ggplot(dat, aes(x, y)) + 
    geom_line(aes(color = person)) + 
    theme_minimal(base_size = 14) 
p2 <- ggplot(dat, aes(x, y)) + 
    geom_violin(fill = NA) + 
    theme_minimal(base_size = 14) + 
    theme(axis.title = element_text(color = NA), 
     axis.text = element_text(color = NA)) 

library(gridExtra) 
grid.arrange(p1, p2, ncol=2, widths = c(4,1)) 

其給出:

enter image description here

然而,線和曲線的小提琴現在由圖例分離。附:

library(gtable) 
leg <- gtable_filter(ggplot_gtable(ggplot_build(p1)), "guide-box") 

grid.arrange(p1 + guides(color = FALSE), p2, leg, ncol=3, widths = c(4,1,1)) 

您可以將傳奇的地方,最右邊再次情節:

enter image description here

+0

有沒有什麼方法可以在x = 11處顯示此小提琴,而不是跨越整個圖形?理想情況下,我希望它在現在的線條和圖例之間顯示。 – Florian

+0

在OP中查看我的編輯以進行澄清。 – Florian

+0

@Florian查看更新 – Jaap

1

我想通了:

ggplot(dat, aes(x, y, group=person)) + geom_line(aes(color=person)) + 
    geom_violin(aes(x=rep(11, nrow(dat)), y=y, group=1)) 

注意事項:設置aes(x=11, y=y)geom_violin()不起作用,因爲(a)x和y必須具有相同的長度,並且(b)您將獲得10把小提琴。

(A)可以通過rep()可以避免「荷蘭國際集團的數量來創建相等長度的載體來y和(b)通過設置group = 1(如由Procrastinatus鮃指出避免」回答)。

所得的情節:

enter image description here

如果有一個更好的解決方案,這一點,我很想看看吧!

+0

這不會給正確的小提琴情節。另請參閱我的更新回答 – Jaap

+0

「不正確」是什麼意思?如果x軸上的值較大,但可以用'geom_violin(...,width = X)'調整,小提琴可能會顯示爲垂直線 - 但小提琴*將包含'y中的數據'。有什麼不正確的? – Florian

+0

這會導致小提琴的形狀不同 – Jaap