【发布时间】:2021-03-09 22:04:09
【问题描述】:
我有几个月的数据(百分比变化),用于一个国家的不同州,我想将其绘制为地图(每个月作为单独的 png)并使用魔法将其动画化为 GIF。
但是,百分比变化(离散值)在每个月中的最大值和最小值不同。如果我只是简单地绘制每个月的最高值,则指定的红色将代表每个月的不同最大值(例如,1 月份的 +240% - 245% 和 2 月份的 +260% - 265%)。为了解决这个问题,我在一个向量中收集了所有月份发生的所有百分比变化。这些离散值被分配了颜色(从浅红色 - “0% - 5%” - 到深红色 - “260% - 265%”),例如“240% - 245%”在 1 月和 2 月都将显示为相同的红色。
问题是:每张地图绘制的图例不同,因为并非每个月都存在每个百分比变化,当然只有每个月的每个子集中存在的值显示在传说。
是否可以 (1) 为所有地图显示相同的图例(所有离散值从“0-5%”到“260% - 265%”,即使不是每个月都绘制所有值)或( 2)我可以简单地添加一个“假”的连续图例,范围从浅红色到深红色,范围从 0% 到 265%? (我发现 geom_blank() 可能对此有所帮助,但是,我还没有成功。)
这是一个最小的可重现示例:
install.packages("sf")
install.packages("ggplot2")
install.packages("magick")
install.packages("tidyverse")
install.packages("maps")
library(sf)
library(ggplot2)
library(magick)
library(tidyverse)
library(maps)
states <- st_as_sf(map("state",
plot = FALSE,
fill = TRUE))
labels <- function(start, end) {
vec <- seq(start, end, 5)
paste0(vec,
"%",
" – ",
vec + 5,
"%")
}
lab_jan <- labels(0, (length(states$ID) - 1) * 5)
lab_feb <- labels(20, (length(states$ID) + 3) * 5)
colfun <- colorRampPalette(c("#EE7F74", "#86372E"))
col <- colfun(length(unique(c(lab_jan, lab_feb))))
lab_col <- tibble(label = unique(c(lab_jan, lab_feb)),
color = col)
states_jan <- bind_cols(states,
lab_jan = factor(lab_jan,
levels = lab_jan))
states_feb <- bind_cols(states,
lab_feb = factor(lab_feb,
levels = lab_feb))
jan_01 <- ggplot() +
geom_sf(data = states_jan,
aes(fill = lab_jan)) +
theme_void() +
scale_fill_manual(values = lab_col %>%
filter(label %in% states_jan$lab_jan) %>%
pull(color)) +
#theme(legend.position = "none") +
ggsave("01_jan.png", width = 10)
feb_02 <- ggplot() +
geom_sf(data = states_feb,
aes(fill = lab_feb)) +
theme_void() +
scale_fill_manual(values = lab_col %>%
filter(label %in% states_feb$lab_feb) %>%
pull(color)) +
#theme(legend.position = "none") +
ggsave("02_feb.png", width = 10)
list.files(pattern = '*.png', full.names = TRUE) %>%
image_read() %>%
image_join() %>%
image_animate(fps = 1) %>%
image_write("states.gif")
```
【问题讨论】: