2012-05-08 13 views
14

Estoy tratando de dibujar un diagrama con varias curvas. El eje x no son valores numéricos, sino cadenas.ggplot con Strings en x-Axis

Esto funciona bien (como en how to plot all the columns of a data frame in R):

require(ggplot2) 
df_ok <- rbind(data.frame(x=4:1,y=rnorm(4),d="d1"),data.frame(x=3:1,y=rnorm(3),d="d2")) 
ggplot(df_ok, aes(x,y)) + geom_line(aes(colour=d)) 

Pero mis datos es el siguiente:

require(ggplot2) 
df_nok <- rbind(data.frame(x=c("four","three","two","one"),y=rnorm(4),d="d1"),data.frame(x=c("three","two","one"),y=rnorm(3),d="d2")) 
ggplot(df_nok, aes(x,y)) + geom_line(aes(colour=d)) 

me sale el error geom_path : Cada grupo consta de una sola observación. ¿Necesita ajustar la estética del grupo?. Aunque las líneas del gráfico no aparecen, los ejes se trazan, y el eje x contiene las etiquetas correctas, pero también en orden incorrecta.

¿Alguna idea de cómo trazar esto tan fácil como sea posible? (También tenga en cuenta los valores de X que faltan para algunas series).

Respuesta

18

Su problema es que la variable x es un factor. Por lo tanto, cambiar la trama de datos y hacer x un doble:

df = rbind(data.frame(x=4:1,y=rnorm(4),d="d1"), 
      data.frame(x=3:1,y=rnorm(3),d="d2")) 

Terreno con normalidad

g = ggplot(df, aes(x,y)) + geom_line(aes(colour=d)) 

pero alterar el eje x escalado de forma explícita:

g + scale_x_continuous(breaks=1:4, labels=c("one", "two", "three", "four")) 

Para cambiar el nombre su variable, intente algo como:

x1 = factor(df_nok$x, 
      levels=c("one", "two", "three", "four"), 
      labels=1:4) 
df$x1 = as.numeric(x1) 
+0

Me encantaría no tener que reformar mis datos. Pero si nadie más tiene una idea, aceptaré esta respuesta. – fabb

+1

¿Tiene una idea de cómo puedo reformar fácilmente mis datos en este formulario cuando tengo 'df_nok' y un orden deseado de' x'? – fabb

+0

te votaría diez si pudiera. debe recordar 'as.is = TRUE' casi todo el tiempo! Tuvo un segundo problema de problema debido a que la fecha era un carácter después de establecer 'as.is = TRUE' pero eso se resolvió fácilmente con' as.Date() '. – ricardo

5

Puede convencer a ggplot para dibujar líneas mediante la adición de un grupo ficticio,

ggplot(df_nok, aes(x,y)) + geom_line(aes(colour=d, group=d)) 

Véase también http://kohske.wordpress.com/2010/12/27/faq-geom_line-doesnt-draw-lines/

+1

Esto no funciona correctamente. Dibuja una línea con segmentos de colores, pero no 2 líneas separadas. – fabb

+0

Debe ser 'group = d', not' group = 1'. –

+0

¡Cosas geniales! Ahora solo el orden ya está mal ("cuatro", "uno", "tres", "dos"). ¿Alguna ayuda rápida para eso? – fabb

3

Agregue en la estética group (algo redundante, lo sé, pero mucho más simple que volver a jigging las etiquetas del eje).

df_nok <- rbind(data.frame(x=c("four","three","two","one"),y=rnorm(4),d="d1"),data.frame(x=c("three","two","one"),y=rnorm(3),d="d2")) 

ggplot(df_nok, aes(x,y, group=d)) + geom_line(aes(colour=d)) 

Es cierto que su eje x todavía no está en el orden que usted desea. Tal como lo señala @csgillespie, puede corregirlo convirtiéndolo en un factor

df_nok$x <- factor(df_nok$x, 
      levels=c("one", "two", "three", "four"), 
      labels=1:4) 
+0

Mejor un año tarde que nunca, ¿verdad? Bueno, de todos modos, esto será para gente como yo que tropieza con esto en el futuro. – Tom

+0

Derecha, gracias por la respuesta adicional. – fabb