Добавление типа линии в легенду в ggplot2

Как мне сделать так, чтобы типы линий, используемые geom_hline или geom_abline, отображались в легенде графика ggplot?

Например:

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

Как насчет нескольких линий / типов линий?

Скажем, я также хотел построить групповые и общие геометрические средние.

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")

Я ожидал, что этот подход покажет тип линии в легенде на основе этот пост, но не повезло

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

Вот еще один случай, когда я хотел бы сделать что-то подобное с abline

Было бы неплохо иметь возможность пометить строку как 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


person janattack    schedule 03.06.2013    source источник


Ответы (1)


Вы просматриваете несколько примеров, но этот простой случай должен помочь вам в этом больше всего:

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, создав легенду, сопоставив тип линии с символом «ожидаемый», в результате чего за кулисами создается новый столбец. Несколько типов линий должны работать должным образом с обычными методами создания столбцов и их сопоставления с типом линий.

person joran    schedule 03.06.2013
comment
Спасибо! Для полноты: добавление «guides (color = guide_legend (override.aes ​​= list (linetype = 0)))» заставляет легенду для цвета отображаться в виде точек без линий, что более подходит для этого случая. - person janattack; 03.06.2013