2011-03-25 12 views
14

Mis problemas comenzaron cuando tenía una variable con más de 6 valores porque ese es el valor máximo actual para la función scale_shape en ggplot2.¿Cómo combinar el color y la forma?

Debido a ese problema probé una solución con otra variable que acabo de envolver a lo largo de la variable original.

Aquí está mi código de ejemplo:

dataf <- structure(list(Municipality = structure(c(2L, 4L, 10L, 11L, 6L, 8L, 3L, 1L, 5L, 9L, 7L), .Label = c("Boyuibe", "Cabezas", "Camiri", "Charagua", "Cuevo", "Gutierrez", "Huacaya", "Lagunillas", "Machareti", "Vallegrande", "Villa Vaca Guzman"), class = "factor"), Growth = c(3.05, 2.85, 0.14, 1.21, 1.59, 2.35, -0.41, 0.81, 0.9, 2.89, 1.8), Density = c(3.0390920594, 0.260984024187, 5.20069847261, 2.50828556783, 3.43964629267, 3.69768961375, 32.4496626479, 2.06145019368, 4.2139578988, 0.740736713557, 1.67034079825)), .Names = c("Municipality", "Growth", "Density"), class = "data.frame", row.names = c(NA, -11L)) 

dataf <- dataf[with(dataf, order(Municipality)), ] 
# create a new column with values 1 to 6 and same length as Municipality 
modulus <- function(x) (x - 1) %% 6 + 1 
indeces <- 1:length(dataf$Municipality) 
dim(indeces) <- length(dataf$Municipality) 
dataf$Shape <- apply(indeces, 1, modulus) 
dataf$Shape <- factor(dataf$Shape, levels=unique(dataf$Shape)) 
plot1 <- ggplot(dataf, aes(x=Density, y=Growth, colour=Municipality, 
     shape=Shape)) 
plot1 <- plot1 + geom_point(size=3) 
plot1 <- plot1 + scale_x_continuous(expression(paste(
     "Population Density [people per km"^2, "]", sep=""))) 
plot1 <- plot1 + scale_y_continuous("Growth Rate [ratio population 2001/
     population 1992]") 
plot1 <- plot1 + scale_colour("Municipality") 
plot1 

que produce el siguiente resultado: enter image description here

Me gustaría que la leyenda a ser igual que los puntos de la trama. ¿Es posible o hay una solución inteligente para mi primer problema con la lista de municipios demasiado largos?

Gracias de antemano.

+0

por favor 'dput()' el contenido del nombre de archivo para que alguien pueda ejecutar su código. Además, consulte la [guía de publicación] (http://www.r-project.org/posting-guide.html) en CRAN para obtener otros consejos para obtener ayuda. – Chase

Respuesta

9

aquí es un ejemplo:

plot1 <- ggplot(dataf, aes(x=Density, y=Growth, colour=Municipality, 
     shape=Municipality)) 
plot1 <- plot1 + geom_point(size=3) 
plot1 <- plot1 + scale_colour_discrete() + 
scale_shape_manual(values=as.numeric(dataf$Shape)) 
plot1 

si necesita formas rellenas, a continuación, vuelva a colocar con

scale_shape_manual(values=c(16, 17, 15, 3, 7, 8)[as.numeric(dataf$Shape)]) 

los trucos son:

  1. utilización misma variable para el color y la forma aes (Municipio)
  2. use scale_shape_manual y haga el mapeo o f descansos (en este caso, el municipio) y el valor (en este caso, dataf $ forma)
  3. que necesita variable numérica en lugar del factor de valores de scale_shape_manual
+0

'as.numeric' es el truco que estaba buscando. Muchas gracias. Lo cambié ligeramente a 'as.numeric (dataf $ Municipality)'. – Midnighter

2

Qué acerca del uso scale_shape_manual()? Si entendí tu pregunta correctamente, realmente no necesitas diferenciar tanto por el color como por la forma y preferiría la forma, ¿verdad?

ggplot(dataf, aes(x=Density, y=Growth)) + 
    geom_point(aes(shape = Municipality)) + 
    scale_shape_manual(values = 1:11) 

produce: enter image description here

+0

Tiene razón, la forma es la principal característica distintiva. La respuesta de @ kohske es más flexible, sin embargo. – Midnighter

9

Además truco: Si usted le da un nombre o bien la leyenda, debe darles tanto el mismo nombre. Si le da un nombre a una sola leyenda, ggplot separará las leyendas nuevamente. Modificando el ejemplo de kohske:

plot1 <- ggplot(dataf, aes(x=Density, y=Growth, colour=Municipality, 
     shape=Municipality)) + geom_point(size=3) 

plot2 <- plot1 + scale_colour_discrete() + 
scale_shape_manual(values=as.numeric(dataf$Municipality)) 

plot2 

plot3 <- plot1 + scale_colour_discrete('City') + 
scale_shape_manual(values=as.numeric(dataf$Municipality)) 

plot3 

plot4 <- plot1 + scale_colour_discrete('City') + 
scale_shape_manual('City',values=as.numeric(dataf$Municipality)) 

plot4 
+0

No sé si hay algún efecto secundario, pero creo que esta es la mejor solución. Para mí, incluso funcionó con "scale_colour_discrete ('City')" y "scale_shape_discrete ('City')" sin ninguna asignación manual. – BumbleBee

Cuestiones relacionadas