2011-02-23 18 views
42

Tengo un diagrama simple geom_point, en el cual la variable x es ordinal, tomando 5 valores (codificados 1: 5).Personalizar etiquetas de ejes

En el gráfico, me gustaría reemplazarlo por 5 etiquetas de texto correspondientes. ¿Es posible hacerlo en ggplot?

Respuesta

42

usted debería ser capaz de hacer esto con scale_x_discrete.

library(ggplot2) 
df <- data.frame(x = 1:5, y = sample(1:10, 5, TRUE)) 

qplot(factor(x),y, data = df) + 
scale_x_discrete(breaks = 1:5, labels=c("foo","bar","baz","phi","fum")) + 
xlab(NULL) 
+5

Por desgracia, esto no funciona si el eje x no es un factor. – gappy

+1

@gappy: la clave aquí es convertir el eje x en un factor. La solución que @prasad y yo proporcionamos hace esto en la llamada ggplot misma (el bit 'factor (x)' y 'ordered (x)'), mientras que @ Gavin la maneja en un paso de preproceso. El resultado final de las tres respuestas es que el 'eje x 'se trata como un factor antes de trazar. – Chase

+2

@gappy sus datos * son * lo que R consideraría un factor, al menos a partir de la breve descripción que usted brinda. ¿Pueden los datos tomar un valor de 1.5 decir? Si pueden, ¿qué etiqueta deberían obtener esos puntos de datos? Si sus datos * son * ordinales, entonces debe decir esto a R y almacenarlo como/coaccionar a un factor ('factor()') o un factor ordenado ('ordered()'). Si lo hace, hará lo correcto en muchos casos. Vea mi respuesta: se dibuja la trama correcta si le dice a R que los datos son un factor. Las respuestas de @Chase y @Prasad coaccionan como parte de la trama y permiten la personalización en tiempo de ejecución de las etiquetas. –

2

Aquí está un ejemplo reproducible Creo que encapsula su Q (?):

require(ggplot2) 
dat <- data.frame(X = sample(1:5, 100, replace = TRUE), 
        Y = rnorm(100)) 

No es inmediatamente claro qué datos que tiene, pero si usted quiere decir algo como esto:

(p1 <- ggplot(dat, aes(x = X, y = Y)) + geom_point()) 

entonces creo que quiere una Stripchart, que se puede lograr en ggplot a través de un factor

dat2 <- within(dat, X <- factor(X, labels = letters[1:5])) 
(p2 <- ggplot(dat2, aes(x = X, y = Y)) + geom_point()) 

Si esto es no es lo que quieres decir, ¿puedes editar tu Q para dar un ejemplo?

10

scale_x_discrete debería hacerlo:

x <- sample(1:5, 20, T) 
y <- rnorm(20) + x 

df <- data.frame(x = ordered(x), y = y) 

ggplot(df,aes(x,y)) + geom_point() + 
    scale_x_discrete(breaks = 1:5, labels = letters[1:5]) 
+0

no siendo un gran usuario de ggplot, ¿no está 'scale_x_discrete' implícito si' x' es un factor? Si es así, ¿existe una ventaja al llamarlo directamente en lugar de obtener las etiquetas de factor correctas en los datos? ¿Podría pedir lo mismo de @Chase que ha suministrado la misma respuesta? –

+0

@Gavin tiene razón, 'scale_x_discrete' solo se usa para anular las etiquetas de factores predeterminadas. Supongo que es útil si tiene un marco de datos y desea trazarlo de manera diferente en diferentes situaciones (es decir, usar etiquetas diferentes cada vez), de modo que no tenga que cambiar el marco de datos cada vez. –

+0

@Gavin & @Prasad - Entendí que la pregunta de OP significaba que tenía valores numéricos que quería representar como categóricos u ordinales en este caso. Es interesante que Prasad y yo desarrollamos la misma respuesta. ¿Hay una preferencia por 'ordered()' over 'factor()'? – Chase

Cuestiones relacionadas