Peter.k
Peter.k

Reputation: 1548

how to customize names of legend labels in ggplot

I have the following code:

p <- ggplot() + coord_fixed() + xlab("") + ylab("")

base_world <- p + geom_polygon(data=world_map, aes(x=long, y=lat, group=group), 
                                         colour="green", fill="whitesmoke") +
                      geom_point(data = as.data.frame(coordinates(busxy)), size = 1,
                                        mapping = aes(x = busxy@coords[,1], y = busxy@coords[,2],
                                                      color = busxy$color)) +
                      labs(title = "Cities\n", color = "States\n") +
                      scale_color_manual(labels = col2state$s, values = col2state$c)

It prints this: enter image description here

The problem is the colors on map doesn't correspond with those in legend. When I delete scale_color_manual(labels = col2state$s, values = col2state$c) from the plot it's all right but 'States' have names of colors from the data.

My question is: How to leave labels names like in the image but also assign proper colors to those labels as in the map?

In col2state$c are 29 color names (like #29A934) In col2state$s are 29 state labels like in legend. Data frame busxy contains 144k records with 29 unique values of states.

Data is from: library(maps)

world_map <- map_data("world")

busxy <- data.frame(x=bus[[1]]$latitude, y=bus[[1]]$longitude, city=bus[[1]]$city, state=bus[[1]]$state)

bus <- llply(as.list(jfile5), function(x) jsonlite::stream_in(file(x), pagesize = 10000)) and jfile5 is the path to json file contains all data.

Upvotes: 0

Views: 1404

Answers (2)

Wen-Bin Luo
Wen-Bin Luo

Reputation: 177

scale_color_manual can do without the labels parameter. A way to solve this is scale_color_manual(values = my_colors) where my_colors is the mapping of countries to their color, organized in a named character vector, e.g. c(AZ = "blue", NV = "red", ...)

An example:

df <- data.frame(x=1:3, y = 2:4, f = as.factor(1:3))
my_colors <- c('1'= "blue", '2' = "red", '3' = "yellow")
ggplot(df) + geom_point(aes(x = x, y = y, color = f)) + scale_color_manual(values = my_colors)

Upvotes: 2

juliamm2011
juliamm2011

Reputation: 136

Instead of calling the columns, save vectors of the unique values for color and for state labels. Ensure the vectors are ordered to match.

vec_c <- unique(col2state$c)
vec_s <- unique(col2state$s) #may need to re-order, or opt to manually create vector
scale_color_manual(labels = vec_c, values = vec_s)

Upvotes: 0

Related Questions