Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to merge colour and shape?

Tags:

r

ggplot2

My troubles started when I had a variable with more than 6 values because that is the current maximum value for the scale_shape function in ggplot2.

Due to that problem I tried a work-around with another variable that I just wrapped around the length of the original variable.

Here is my example code:

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

that produces the following output: enter image description here

I would like the legend to be just like the points in the plot. Is that possible, or is there a smart solution to my first problem with the list of municipalities being too long?

Thanks in advance.

like image 315
Midnighter Avatar asked Mar 25 '11 17:03

Midnighter


People also ask

How do you merge shapes in Word?

Merge shapes Select the shapes you want to merge: press and hold the Shift key while you select each shape in turn. (If you don't select any shapes, then the Merge Shapes button in step 2 will be grayed out.) On the Shape Format tab, in the Insert Shapes group, select Merge Shapes, and then pick the option you want.

How do I change the shape of the color in Tableau legend?

Right-click (Control-click on Mac) the legend and select Edit Colors. Select a data item in the list on the left, and then select a new color in the palette on the right. Click OK.


2 Answers

here is an example:

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

if you need filled shapes, then replace with

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

the tricks are:

  1. use same variable for colour and shape aes (Municipality)
  2. use scale_shape_manual and make mapping of breaks (here, Municipality) and value (here, dataf$Shape)
  3. you need numeric variable instead of factor for values of scale_shape_manual
like image 126
kohske Avatar answered Oct 09 '22 13:10

kohske


Further trick: If you give either legend a name, you must give them both the same name. If you give only one legend a name, ggplot will separate the legends again. Amending kohske's example:

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
like image 23
ewallace Avatar answered Oct 09 '22 13:10

ewallace