2012-06-19 10 views
7

Ho qualche codice ggplot che ha funzionato bene in 0.8.9 ma non in 0.9.1.geom_vline con Character xintercept

ho intenzione di tracciare i dati in theDF e vorrebbe tracciare una linea verticale a xintercept="2010 Q1."theGrid è semplicemente utilizzato per creare theDF.

theGrid <- expand.grid(2009:2011, 1:4) 
theDF <- data.frame(YrQtr=sprintf("%s Q%s", theGrid$Var1, theGrid$Var2), 
        Minutes=c(1000, 2200, 1450, 1825, 1970, 1770, 1640, 1920, 1790, 1800, 1750, 1600)) 

Il codice utilizzato è:

g <- ggplot(theDF, aes(x=YrQtr, y=Minutes)) + 
     geom_point() + 
     opts(axis.text.x=theme_text(angle=90)) 

g + geom_vline(data=data.frame(Vert="2010 Q2"), aes(xintercept=Vert)) 

nuovo, questo funzionava bene in R 2.13.2 con ggplot2 0.8.9, ma non fa in R 2.14+ con ggplot2 0.9.1.

Una soluzione è:

g + geom_vline(data=data.frame(Vert=4), aes(xintercept=Vert)) 

Ma non è una buona soluzione per il mio problema.

Forse scherzare con scale_x_discrete potrebbe essere d'aiuto?

+0

Questo non è riproducibile senza 'theVerts' (che presumo sia un frame di dati?). – joran

+0

@joran Ho avuto 'dati =' in 'aes' per caso. È stato riparato ora, il valore di riferimento è stato sostituito da 'data.frame (Vert =" 2010 Q2 ")'. – Jared

+0

Sembra un bug. Puoi presentare un problema a: https://github.com/hadley/ggplot2/issues – wch

risposta

0

Quando si utilizza un vettore di caratteri o un fattore, per l'asse x in un grafico i valori predefiniti dati a ciascuno degli elementi univoci sono semplicemente interi a partire da 1. Quindi, se i livelli sono c ("A "" B "," C ") quindi le posizioni dell'asse x sono c (1,2,3). Non esiste una posizione di personaggio, solo un'etichetta di carattere. Se vuoi una linea verticale in A, allora mettila a 1. Se la vuoi a metà tra A e B, allora mettila a 1,5. Di nuovo, quelli sono i valori predefiniti. Se una trama particolare ha fatto qualcos'altro, puoi facilmente risolverlo mettendo delle linee in alcune posizioni e vedendo cosa succede.

+0

Sì, è così. Ma nella vecchia versione di 'ggplot2' se lo si alimentava con" A ", lo traduceva in 1 e posizionava correttamente la linea. Questo comportamento è auspicabile perché l'utente conoscerà la scala originale, non necessariamente ciò che si traduce. Spero di ricreare il comportamento 'ggplot2' usato per esporre. – Jared

12

Si potrebbe provare questo:

g + geom_vline(aes(xintercept = which(levels(YrQtr) %in% '2010 Q1'))) 

Questo evita la necessità di creare una cornice di dati fittizia per il livello di fattore selezionato. Il comando which() restituisce l'indice (o gli indici se il lato destro dell'operatore% in% è un vettore) del livello del fattore [s] da associare alle vline.

Una cautela con questo è che se alcune delle categorie non appaiono nei dati e si utilizza drop = TRUE nella scala, poi le linee saranno non presentarsi nel posto giusto.

+0

Approccio interessante. Controllerò che sia generalizzabile ad altri tipi di dati. – Jared

Problemi correlati