2012-06-19 11 views
7

Tengo un código ggplot que funcionó bien en 0.8.9 pero no en 0.9.1.geom_vline con Character xintercept

voy a representar los datos en theDF y me gustaría trazar una línea vertical en xintercept="2010 Q1."theGrid es simplemente utilizado para crear 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)) 

El código utilizado es:

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)) 

Una vez más, esto funcionó muy bien en R 2.13.2 con ggplot2 0.8.9, pero no lo hace en I 2.14+ con ggplot2 0.9.1.

Una solución es:

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

Pero eso no es una buena solución para mi problema.

¿Quizás ayudar con scale_x_discrete podría ayudar?

+0

Esto no es reproducible sin 'theVerts' (que supongo que es un marco de datos?). – joran

+0

@joran Tuve 'data =' in 'aes' por accidente. Ahora está arreglado, theVerts ha sido reemplazado por 'data.frame (Vert =" 2010 Q2 ")'. – Jared

+0

Esto parece un error. ¿Puede presentar un problema en: https://github.com/hadley/ggplot2/issues – wch

Respuesta

0

Cuando utiliza un vector de caracteres, o un factor, para el eje x en un gráfico, los valores predeterminados asignados a cada uno de los elementos únicos son simplemente enteros comenzando en 1. Entonces, si sus niveles son c ("A "" B "," C "), entonces las ubicaciones del eje x son c (1,2,3). No existe la ubicación de un personaje, solo una etiqueta de personaje. Si quiere una línea vertical en A, póngalo en 1. Si lo quiere a medio camino entre A y B, entonces colóquelo en 1.5. De nuevo, esos son los valores predeterminados. Si un argumento en particular hizo algo más, puedes resolverlo colocando líneas en algunos lugares y viendo qué sucede.

+0

Sí, ese es el caso. Pero en la versión anterior de 'ggplot2' si lo alimentaba con" A ", traducía eso a 1 y colocaba la línea correctamente. Este comportamiento es deseable porque el usuario conocerá la escala original, no necesariamente a qué se traduce. Espero recrear el comportamiento 'ggplot2' utilizado para exhibir. – Jared

12

Usted podría intentar esto:

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

Esto evita la necesidad de crear un marco de datos ficticios para el nivel de factor seleccionado. El comando which() devuelve el índice (o índices si el lado derecho del operador% en% es un vector) del nivel de factor [s] para asociar con vlines.

Una advertencia con esto es que si algunas de las categorías no aparecen en sus datos y usa drop = TRUE en la escala, entonces las líneas no aparecerán en el lugar correcto.

+0

Enfoque interesante. Verificará para asegurarse de que sea generalizable a otros tipos de datos. – Jared

Cuestiones relacionadas