2015-04-17 9 views
6

R 3.1.2/ggplot2_1.0.0/Windows7Wie in ggplot2

ein Etikett für eine vertikale Linie mit Legende hinzufügen Wie kann man zwei vertikale Linien mit Legenden in einem facettierten Graphen hinzufügen, ohne dass sie den Linientyp ändern? Im folgenden Beispiel kann ich die Legenden nicht so erscheinen lassen, wie ich es mir vorstelle (zwei durchgezogene Linien und eine passende Legende), aus dem Code, den ich schreibe. Ein reproduzierbares Beispiel:

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

Ich möchte die Linien fest sein (Farbe ist ok) und der Titel der Legende zu sagen: "Medida de tendencia".

Antwort

5

Die Hauptidee für eher kompliziertes ggplot s wie Ihr ist es, die Datenvorbereitung von tatsächlichen Plotten zu trennen. Innerhalb des Datenvorbereitungsschritts können Sie Ihre Daten nach dem von Ihnen gewählten Plotkonzept organisieren.

In Ihrem Fall diese impliziert precomputing die Statistik in Frage:

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) 

und dann das Zuordnungsschema ist sehr einfach, so dass Sie über Nachführbefehle der Legende müssen nicht denken.

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

(Schönes Grundstück, übrigens.)