2013-06-03 98 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