2015-04-17 20 views
6

R 3.1.2/ggplot2_1.0.0/Windows7Jak dodać etykietę do linii pionowej z legendą w ggplot2

Jak można dodać 2 pionowe linie z legend w aspektach wykresu bez nich zmieniając rodzaj linii? W poniższym przykładzie nie mogę wyświetlić legendy tak, jak bym je sobie wyobraził (dwie linie ciągłe i legenda adecuate) z kodu, który piszę. Powtarzalny przykład:

library(ggplot2) 
library(plyr) 
library(e1071) 

set.seed(89) 
pm <- data.frame(pm10=rnorm(400, 150, 50), estacion=gl(4,100, labels = c('sur', 'norte', 'este', 'oeste'))) # data 
curtosis <- ddply(pm, .(estacion), function(val) sprintf("curtosis==%.2f", kurtosis(val$pm10))) 
asimetria <- ddply(pm, .(estacion), function(val) sprintf("asimetría==%.2f", skewness(val$pm10))) 

p1 <- ggplot(data=pm, aes(x=pm10, y=..density..)) + 
    geom_histogram(bin=15, fill='#deebf7', colour='#bdbdbd')+ 
    geom_density(size=1, colour='#cccccc')+ 
    geom_vline(data=aggregate(pm[1], pm[2], quantile, .8), mapping=aes(xintercept=pm10, linetype='percentil .8'), size=1, colour='#dfc27d', show_guide = T)+ 
    geom_vline(data=aggregate(pm[1], pm[2], median), mapping=aes(xintercept=pm10, linetype='mediana'), size=1, colour='#80cdc1', show_guide = T)+ 
    geom_text(data=curtosis, aes(x=350, y=.010, label=V1), size=3, parse=T)+ 
    geom_text(data=asimetria, aes(x=350, y=.008, label=V1), size=3, parse=T)+ 
    guides(linetype=guide_legend(override.aes=list(colour = c("#dfc27d","#80cdc1"))))+ 
    xlim(0,500)+ 
    facet_wrap(~ estacion, ncol=2) 

print(p1) 

enter image description here

Chcę linie być stałe (kolor jest ok) i tytuł legendy, by powiedzieć: "Medida de tendencia".

Odpowiedz

5

Główną ideą dla bardziej skompliowanych, takich jak Twoja, jest oddzielenie przygotowania danych od faktycznego kreślenia. W ramach etapu przygotowania danych możesz porządkować swoje dane zgodnie z koncepcją spisku, którą masz na myśli.

W twoim przypadku oznacza to precomputing statystykę w pytaniu:

df_vline <- rbind(
    aggregate(pm[1], pm[2], quantile, .8), 
    aggregate(pm[1], pm[2], median) 
) 
df_vline$stat <- rep(c("percentil .8", "mediana"), each = nrow(df_vline)/2) 

a następnie schemat odwzorowania jest dość proste, więc nie trzeba myśleć o ręcznym overriding legendy.

ggplot(data=pm, aes(x=pm10, y=..density..)) + 
    geom_histogram(bin=15, fill='#deebf7', colour='#bdbdbd')+ 
    geom_density(size=1, colour='#cccccc')+ 
    geom_vline(data=df_vline, mapping=aes(xintercept=pm10, colour = stat), 
      linetype = 1, size=1, show_guide = T)+ 
    geom_text(data=curtosis, aes(x=350, y=.010, label=V1), size=3, parse=T)+ 
    geom_text(data=asimetria, aes(x=350, y=.008, label=V1), size=3, parse=T)+ 
    scale_colour_manual(values = c("#dfc27d","#80cdc1"), name = "Medida de tendencia")+ 
    xlim(0,500)+ 
    facet_wrap(~ estacion, ncol=2) 

enter image description here

(Ładna działka, nawiasem mówiąc).