2015-11-04 213 views
3

我使用ggplot2創建了混合密度圖,我想在圖中添加彙總信息,即每個密度的平均值和代表某種真實平均值的1值。R - 在ggplot2中定製圖例以添加geom_vline()組件

這裏是一個模擬的例子,來自@Hernando Casas。

set.seed(1234) 
data <- data.frame(value = rnorm(n = 10000, mean =50, sd = 20), 
       type = sample(letters[1:2], size = 10000, replace = TRUE)) 
data$value[data$type == "b"] <- data$value[data$type == "b"] + 
rnorm(sum(data$type == "b"), mean = 55) 
library(ggplot2) 
gp <- ggplot(data=data, aes_string(x="value")) 
gp <- gp + geom_density(aes_string(fill="type"), alpha=0.3) 

enter image description here

添加的摘要信息作爲垂直線之後。劇情是這樣的

vlines <- data.frame(value = c(mean(data$value[data$type == "a"]), mean(data$value[data$type == "b"])),Mean = c("A", "B")) 

gp2 <- gp + geom_vline(data=vlines, 
        aes(xintercept=value, colour=Mean), 
        size=1.05, linetype="dashed", show_guide=TRUE) 
gp3 <- gp2+geom_vline(xintercept=(50+55+50)/2, 
       size=1.05) 

enter image description here

雖然情節是我想要什麼,我想這黑色實線添加入禁區「中庸」與一個名稱下的傳奇說「總體」。這是我陷入困境的地方,我根本不知道如何定製傳奇,因爲我沒有太多的經驗ggplot2

我發現了一些例子和修改我的代碼

gp <- ggplot(data=data, aes_string(x="value")) 
gp <- gp + geom_density(aes_string(fill="type"), alpha=0.3) 

vlines <- data.frame(value = c(mean(data$value[data$type == "a"]), 
          mean(data$value[data$type == "b"]), 
          (50+55+50)/2), 
       Mean = c("A", "B", "Overall")) 

gp2 <- gp + geom_vline(data=vlines, 
        aes(xintercept=value, colour=Mean), 
        size=1.05, linetype="dashed", show_guide=TRUE) 

enter image description here

現在我有一個傳說,但我想改變線條的顏色是一樣的密度,更重要的是我需要將「整體」行改爲純黑色,我又遇到了定製問題。

我真的很感激任何人的幫助。謝謝

回答

4

也許最簡單的方法是隻指定一個手動顏色規模和線型規模如下:

ggplot(data=data, aes(x=value)) + 
    geom_density(aes(fill=type), alpha=0.3) + 
    geom_vline(data=vlines, 
      aes(xintercept=value, colour=Mean, linetype=Mean), 
      size=1.05, show_guide=TRUE) + 
    scale_color_manual(values = c("red","green","black")) + 
    scale_linetype_manual(values = c(2,2,1)) + 
    theme_bw() 

這給:

enter image description here

+0

要獲得與填充完全相同的顏色,可以使用'scale_color_manual(values = c(「#F8766D」,「#00BFC4」,「black」))''。資料來源:gg_color_hue函數來自http://stackoverflow.com/a/8197703/5020008 – Heroka

2

使用以下「hack」(使用您的gp2),使用scale_color_manual創建手動色階,可以得到整體平均值的實線和「整體」的圖例條目 - 但在圖例中,線型的「總體」仍然是虛線:

gp3 <- gp2+geom_vline(mapping=aes(color="Overall", xintercept=(50+55+50)/2), 
         linetype="solid", size=1.05) 
cols <- c('black', 'red', 'green') 
names(cols) <- c("Overall", "A", "B") 
gp4 <- gp3 + scale_color_manual(values = cols, name = "Mean") 

據我瞭解GGPLOT2的傳說功能,我認爲這是不可能做到這一點你真正想要的:任何圖例框(如「平均」和「鍵入「在你的例子中)確切地區分一個圖形特徵,如顏色,線型等...你想要什麼,是在一個圖例框中混合的特徵(顏色和線型的不同組合)。也許你考慮爲整體的意思引入一個新的傳奇盒子?

編輯:有可能在一個盒子到指定手動顏色規模和線型比例,見夏侯的帖子:)

+0

非常感謝,這是非常有幫助的。我看到你的觀點,在我的情況下,我可能應該創建一個新的傳奇盒子,我可以再次打擾你如何做到這一點? –