2012-06-26 25 views
7

Quiero hacer una gráfica de puntos con ggplot2 geom_point donde una variable continua es estratificada por diferentes factores.ggplot2 grafica 3 factores con jigging de eje x

es bastante complicado, tal vez estoy tratando de mostrar demasiado en un mismo gráfico, pero tengo tres factores diferentes que influyen cosas

quiero mostrar como este

p <- ggplot(mtcars[,c(1,2,10,11)], aes(factor(cyl), mpg)) 
p + geom_point(aes(colour = factor(gear), shape=factor(carb))) 

enter image description here

Sin embargo, quiero dividir el factor (engranaje), es decir, para cada uno de los tres factores (cyl) del eje x, quiero una distancia pequeña entre los diferentes factores (engranajes) en el eje x

es decir, dentro del factor (cyl) == 4, factor (engranaje) == 3 es una especie de 3.9, factor (engranaje) == 4 está en 4 y factor (engranaje) == 5 es una especie de 4.1. Esto se repite para cada valor de factor (cyl).

esperanza que tiene sentido

Nota: este es un ejemplo de juguete. Lo haría usando valores categóricos, no numéricos en lugar de números factorizados; Me doy cuenta de que tener valores en 3.9/4.1 es confuso.

+1

por qué no faceta de los datos en el engranaje para dar tres parcelas? – John

+0

faceta suena bien, estoy tratando de resolverlo usando esto: http://had.co.nz/ggplot2/facet_grid.html –

+1

si este enlace se encuentra bastante útil para ggplot2 - http://wiki.stdout.org/ rcookbook/Graphs/ – John

Respuesta

8

Con facet_grid() y mtcars ejemplo:

library(ggplot2) 
data(mtcars) 

p <- ggplot(mtcars, aes(factor(cyl), mpg)) + geom_point(aes(colour=factor(carb))) 
p + facet_grid(. ~ gear) 

By number of gears

+0

Esto es genial. ¿Hay alguna manera sencilla de cambiar las propiedades del texto en la parte superior de las diferentes facetas (quizás esta debería ser una pregunta aparte) –

+0

Deseche eso, hay un gran ejemplo aquí: http://wiki.stdout.org/ rcookbook/Gráficos/Facetas% 20% 28ggplot2% 29/(muchas gracias por el enlace John!) –

4

subset es una forma de hacerlo. Cambie los datos por gears, luego coloque el conjunto de puntos para cada subconjunto por turno.

library(ggplot2) 

p <- ggplot() 
p + geom_point(data = subset(mtcars[,c(1,2,10,11)], gear == 3), aes(x = as.numeric(factor(cyl)) - 0.1, y = mpg, colour = factor(gear), shape=factor(carb))) + 
    geom_point(data = subset(mtcars[,c(1,2,10,11)], gear == 4), aes(x = as.numeric(factor(cyl)), y = mpg, colour = factor(gear), shape=factor(carb))) + 
    geom_point(data = subset(mtcars[,c(1,2,10,11)], gear == 5), aes(x = as.numeric(factor(cyl)) + .1, y = mpg, colour = factor(gear), shape=factor(carb))) + 
    scale_x_continuous("Cylinders", breaks = c(1,2,3), labels = c(4,6,8), expand = c(.2,0)) 

enter image description here

+0

Esto funciona con el ejemplo que proporcioné, pero ¿funcionaría si utilizo un valor categórico en lugar de numérico para Cilindros? –

+0

No veo por qué no. Puede intentarlo en los datos de mtcars después de una cierta recodificación: 'library (car); mtcars $ cyl = factor (recode (mtcars $ cyl, "4 = 'Cuatro'; 6 = 'Seis'; 8 = 'Ocho'"), niveles = c ("Cuatro", "Seis", "Ocho")) 'Siempre prefiero la faceta, pero la solución realmente hace exactamente lo que pediste. –

Cuestiones relacionadas