2014-12-14 34 views
9

Sto provando ad aggiungere una linea zero a un grafico sfaccettato in ggplot2 con le date sull'asse x. Il problema è che sto aggiungendo anche poligoni per rappresentare determinati intervalli di tempo, quindi devo passare separato data.frames per separare geoms, il che causa alcune difficoltà.ggplot2 - aggiungi la linea orizzontale al grafico sfaccettato con le date sull'asse x

Ecco un esempio con un asse x continua:

ggplot()+ 
    geom_rect(data=data.frame(from=c(1,3),to=c(2,4)),aes(xmin=from,xmax=to,ymin=-Inf,ymax=Inf),fill="red",alpha=0.1)+ 
    geom_point(data=data.frame(x=c(1,2,3,4,5,6),y=c(6,7,8,9,10,11),type=rep(letters[1:2],each=3)),aes(x=x,y=y))+ 
    facet_grid(type~.) 

Se provo ad aggiungere una linea orizzontale con geom_hline ottengo un errore: Error in if (empty(data)) { : missing value where TRUE/FALSE needed, che prendo è perché geom_vline deve ereditare informazioni fornite nella riga ggplot di base. Come indicato sopra, tuttavia, devo fornire data.frames separato per creare entrambi i punti e i poligoni ombreggiati.

Questo può essere lavorato in giro se l'asse x è continua utilizzando geom_line e l'impostazione dei valori di Inf:

ggplot()+ 
    geom_line(data=data.frame(x=c(-Inf,Inf),y=0),aes(x=x,y=y),col="grey50",lwd=1)+ 
    geom_rect(data=data.frame(from=c(1,3),to=c(2,4)),aes(xmin=from,xmax=to,ymin=-Inf,ymax=Inf),fill="red",alpha=0.1)+ 
    geom_point(data=data.frame(x=c(1,2,3,4,5,6),y=c(6,7,8,9,10,11),type=rep(letters[1:2],each=3)),aes(x=x,y=y))+ 
    facet_grid(type~.) 

Ma se passo l'asse x per le date, quindi non posso aggiungere una linea orizzontale utilizzando geom_hline (per le stesse ragioni come sopra):

dates=c("2001-01-1","2002-01-01","2003-01-01","2004-01-01","2005-01-01","2006-01-01") 

ggplot()+ 
    geom_hline(aes(yintercept=0))+ 
    geom_rect(data=data.frame(from=c(as.Date("2001-01-1"),as.Date("2003-01-01")), 
          to=c(as.Date("2002-01-1"),as.Date("2004-01-01"))), 
      aes(xmin=from,xmax=to,ymin=-Inf,ymax=Inf),fill="red",alpha=0.1)+ 
    geom_point(data=data.frame(x=as.Date(dates),y=c(6,7,8,9,10,11),type=rep(letters[1:2],each=3)),aes(x=x,y=y))+ 
    facet_grid(type~.) 

Analogamente, utilizzando geom_line come sopra genera un errore: Error: Discrete value supplied to continuous scale perché l'asse x non è continua.

posso specificare i punti finali di geom_line come date:

ggplot()+ 
    geom_line(data=data.frame(x=c(as.Date("2001-01-01"),as.Date("2006-01-01")),y=0),aes(x=x,y=y),col="grey50",lwd=1)+ 
    geom_rect(data=data.frame(from=c(as.Date("2001-01-1"),as.Date("2003-01-01")), 
          to=c(as.Date("2002-01-1"),as.Date("2004-01-01"))), 
      aes(xmin=from,xmax=to,ymin=-Inf,ymax=Inf),fill="red",alpha=0.1)+ 
    geom_point(data=data.frame(x=as.Date(dates),y=c(6,7,8,9,10,11),type=rep(letters[1:2],each=3)),aes(x=x,y=y))+ 
    facet_grid(type~.) 

Ma ora la linea non estendere la lunghezza della trama!

Come è possibile riprodurre un output di tipo geom_vline utilizzando qualcosa che funzioni con le date sull'asse xe le faccette?

risposta

8

Il tuo problema è in realtà abbastanza diverso e anche molto facile da risolvere.

Poiché il valore di yintercept nel numero hline non è correlato ai dati, ma un valore specificato dall'utente, questo non deve far parte dello aes().

Invece, la specifica è semplicemente:

geom_hline(yintercept=0) + 

Prova questa:

dates=c("2001-01-1","2002-01-01","2003-01-01","2004-01-01","2005-01-01","2006-01-01") 

ggplot()+ 
    geom_rect(data=data.frame(from=c(as.Date("2001-01-1"),as.Date("2003-01-01")), 
          to=c(as.Date("2002-01-1"),as.Date("2004-01-01"))), 
      aes(xmin=from,xmax=to,ymin=-Inf,ymax=Inf),fill="red",alpha=0.1) + 
    geom_point(data=data.frame(x=as.Date(dates),y=c(6,7,8,9,10,11),type=rep(letters[1:2],each=3)), 
      aes(x=x,y=y)) + 
    geom_hline(yintercept=0) + 
    facet_grid(type~.) 

enter image description here

+1

Figlio di una pistola. Ti devo una coca cola! – jslefche

Problemi correlati