2012-11-26 19 views
7

Sto provando a creare un istogramma con due diagrammi di densità sovrapposti. Il problema: è che voglio una densità per essere una linea tratteggiata, che funziona perfettamente, ma nella leggenda non apparirà la linea tratteggiata, come nel seguente esempioggplot2: Linea tratteggiata nella legenda

x<-sort(rnorm(1000)) 
data<-data.frame(x=x,Normal=dnorm(x,mean(x),sd=sd(x)),Student=dt(x,df=3)) 

ggplot(data,aes(y=x))+geom_histogram(aes(x=x,y=..density..), 
color="black",fill="darkgrey")+geom_line(aes(x=x,y=Normal,color="Normal"),size=1, 
linetype=2)+ylab("")+xlab("")+labs(title="Density estimations")+geom_line(aes(x=x,y=Student,color="Student"),size=1)+ 
scale_color_manual(values=c("Student"="black","Normal"="black")) 

Tutte le idee come ottenere la linea tratteggiata nella leggenda?

Grazie mille!

Rainer

Example Plot

risposta

4

Il modo "ggplot" piace in generale dati siano in formato "lungo" con colonne separate per specificare ogni estetica. In questo caso, il tipo di linea deve essere interpretato come estetico. Il modo più semplice per affrontare questo è quello di preparare i vostri dati nel formato appropriato con reshape2 pacchetto:

library(reshape2) 
data.m <- melt(data, measure.vars = c("Normal", "Student"), id.vars = "x") 

e quindi modificare il codice di tracciamento per cercare qualcosa di simile:

ggplot(data,aes(y=x)) + 
    geom_histogram(aes(x=x,y=..density..),color="black",fill="darkgrey") + 
    geom_line(data = data.m, aes(x = x, y = value, linetype = variable), size = 1) + 
    ylab("") + 
    xlab("") + 
    labs(title="Density estimations") 

Risultati in qualcosa di simile questo:

enter image description here

+0

+1 Avresti potuto semplicemente ricordarmi di aggiungere la chiamata di libreria lol. –

+0

@BrandonBertelsen - questo è stato totalmente il lavoro di due geni indipendenti ... Ho visto sia la tua risposta che la presentazione di Stephen mentre stavo cercando di salvare/caricare la mia risposta ... – Chase

+0

Fanne quella tre. Abbiamo pubblicato tutti a pochi minuti l'uno dall'altro. –

1

Si desidera rimodellare questo formato lungo ... rende più semplice

x<-sort(rnorm(1000)) 
Normal=dnorm(x,mean(x),sd=sd(x)) 
Student=dt(x,df=3) 
y= c(Normal,Student) 
DistBn= rep(c('Normal', 'Student'), each=1000) 
# don't call it 'data' that is an R command 
df<-data.frame(x=x,y=y, DistBn=DistBn) 

head(df) 
      x   y DistBn 
1 -2.986430 0.005170920 Normal 
2 -2.957834 0.005621358 Normal 
3 -2.680157 0.012126747 Normal 
4 -2.601635 0.014864165 Normal 
5 -2.544302 0.017179353 Normal 
6 -2.484082 0.019930239 Normal 



ggplot(df,aes(x=x, y=y))+ 
    geom_histogram(aes(x=x,y=..density..),color="black",fill="darkgrey")+ 
    geom_line(aes(x=x,y=y,linetype=DistBn))+ 
    ylab("")+xlab("")+labs(title="Density estimations")+ 
    scale_color_manual(values=c("Student"="black","Normal"="black")) 

Rplot

+0

non denigrare la distribuzione F! '? df' è anche un comando R :) – Chase

+0

Gawd ... così è. Non l'ho mai notato Il mio codice è pieno di df. –

+0

la mia era finchè qualcuno me l'ha fatto notare ... c'è un post abbastanza dettagliato su SO qui che illustra che sovrascrivere i nomi delle funzioni R non è in realtà * così male come R è abbastanza intelligente nel capire cosa vuoi veramente fare ... probabilmente probabilmente le migliori pratiche per evitarlo - ma è inevitabile con oltre 4000 pacchetti di contribuzioni e molte altre funzioni. – Chase

Problemi correlati