Reputation: 337
I've been omitting I problem I have regarding the production of maps though different columns. Let's say I have a certain dataset, where every row is a polygon:
> crops <- data.frame(pol_num = c("1", "2", "3","4"),
wheat2020 = c("yes", "yeswater", "yes","no"),
wheat2030 = c("yeswater", "no", "no","no"))
> crops
pol_num wheat2020 wheat2030
1 1 yes yeswater
2 2 yeswater no
3 3 yes no
4 4 no no
As you see I have 4 polygons and the suitability of a crop in 2 years. I want to plot these polygons in ggplot with custom colors for each possibility ("yes", "yeswater" and "no").
The only solution I found is to order each column in a certain order:
crops$wheat2020 <- factor(crops$wheat2020, levels = c("yes", "yeswater","no"))
And creat a custom palette with the order of colors I need:
palette <-c("#98E601", "#72DFFE", "#A80100")
And then apply scale_fill_manual
. This gets really tricky because each scenario has different possible combinations. In the example you can see how wheat2020
has 3 different values whereas wheat2030
only 2!
The code, simplified, for my plot and a certain scenario is:
ggplot() +
geom_sf(data = crops, aes(fill = wheat2020), lwd = 0.001) +
scale_fill_manual(labels=c("Yes", "Yes water","No"),
name="Suitability wheat: 2020",
values = palette)
Is there any way to simply indicate which color must correspond each value in the columns, no matter if there is one or two of the possible values missing?
Thanks!
Upvotes: 0
Views: 70
Reputation: 173793
I have created some simple geometry to emulate your data frame better, but essentially all you need is to pass your color values as a named vector:
ggplot() +
geom_sf(data = crops, aes(fill = wheat2020), lwd = 0.001) +
scale_fill_manual(name = "Suitability wheat: 2020",
values = c(yes = "#98E601",
yeswater = "#72DFFE",
no = "#A80100"))
ggplot() +
geom_sf(data = crops, aes(fill = wheat2030), lwd = 0.001) +
scale_fill_manual(name = "Suitability wheat: 2030",
values = c(yes = "#98E601",
yeswater = "#72DFFE",
no = "#A80100"))
Upvotes: 1