2013-06-03 67 views
3

如何讓geom_hline或geom_abline使用的線型顯示在ggplot圖的圖例中?將線型添加到ggplot2中的圖例

例如:

require (ggplot2) 

# some data 
dummy <- data.frame (category1 = rep (1:5, 8), category2 = rep (1:4, each = 10), 
    category3 = rep (factor (1:2), 2), expected = 10^rep (4:7, each = 10), 
    value = 10 ^rnorm(40, 5)) 

# faceted plot 
baseplot <-ggplot (dummy) + 
    geom_point (aes (category1, value, color = category3))+ 
    scale_y_log10() + 
    facet_wrap (~category2) 

# add a dotted line for expected value 
p1 <-baseplot + geom_hline (aes (yintercept = expected), linetype = 2) 

我試了幾種方法可以使虛線圖例顯示出來,但他們給了我同樣的事情,P1

p1a < -p1+scale_linetype_discrete (labels = "expected")+ 
    guides (linetype= guide_legend ("", labels ="expected")) 
p1b <- baseplot + geom_hline (aes (yintercept = expected, linetype = "expected")) + 
    scale_linetype_manual (labels= "expected", values = 2) 
p1a 
p1b 

如何多行/線型?

比方說,我也想繪製GroupWise和整體幾何平均值

require (reshape) 
require (plyr) 

# calculate geometric means, keep them in their own data frame 
geometric_mean <- function (x) exp (mean (log (x))) 
dummy $GM_overall <- geometric_mean (dummy $value) 
extra <- ddply(dummy, c("GM_overall", "expected","category2"), summarize, 
    GM_group = geometric_mean (value)) 
extra_long <- melt (GM_group_long, id.vars = "category2") 

我預計這種方法來顯示線型基於this post的傳說,但沒有這樣的運氣

p2=baseplot + geom_hline (aes (yintercept = value , linetype = variable), extra) 
p2 

這裏的另一個情況下,我想要做一些類似的事情

這將是很好的,能夠標記線1:1

dummy$value2 <- dummy $value * runif(40, 0.5, 2) 
ggplot (dummy)+coord_fixed() +  
    geom_point (aes (value, value2, color = category3))+ 
    geom_abline (yintercept =0, slope =1) 

我,使用R 3.0.0,ggplot 0.9.3.1

回答

3

您通過幾個實例運行,但是這個簡單的例子應該讓你最那裏的方式:

dummy <- data.frame (category1 = rep (1:5, 8), category2 = rep (1:4, each = 10), 
    category3 = rep (factor (1:2), 2), expected = 10^rep (4:7, each = 10), 
    value = 10 ^rnorm(40, 5)) 

# faceted plot 
baseplot <- ggplot(dummy) + 
    geom_point(aes(category1, value, color = category3))+ 
    scale_y_log10() + 
    facet_wrap(~category2) 

# add a dotted line for expected value 
baseplot + geom_hline(aes(yintercept = expected,linetype = "expected"),show_guide = TRUE) 

我認爲大多數情況下的關鍵是增加show_guide = TRUE。默認情況下,該數字爲FALSE,這可能是也可能不是直觀的。 (我可以看到基本原理。)

請注意,在這種「單線型」情況下,我「欺騙」ggplot創建的圖例,將線型映射到字符「expected」,這會導致一個新列在幕後創建。多行類型應按照預期的方式使用創建列並將它們映射到線型的常用方法。

+0

謝謝!爲了完整起見,添加'guides(color = guide_legend(override.aes = list(linetype = 0)))'使得顏色的圖例顯示爲沒有行的點,這對於這種情況更適合。 – janattack