R循环绘制us_maps时跨变量跨年份设置图例静态(min,max)比例尺
问题解决方案
报错根源
database$k的写法错误:R会将$后的字符直接识别为固定列名,也就是会去数据集里找名字为k的列,而不会把k当做循环变量解析为你要的var1/var2,因此触发未知列报错。
修正方法
把动态列调用的写法从$改成双中括号[[ ]],同时在min/max中添加na.rm = TRUE参数避免缺失值导致计算失败,额外添加的scale_size_continuous和当前填充色映射逻辑无关,直接删除即可。
修正后完整代码
library(usmap) library(ggplot2) library(tidyverse) library(haven) library(stringr) library(extrafont) Database <- read.csv(filename) ## 定义变量和标签向量 vars <- c("var1", "var2") labs <- c("lab1", "lab2") ## 循环绘图 for (k in seq_along(vars)) { # 提前计算当前变量全周期的极值,避免循环内重复计算 current_var <- vars[k] var_min <- min(Database[[current_var]], na.rm = TRUE) var_max <- max(Database[[current_var]], na.rm = TRUE) for(i in 0:10) { plot_year <- 1910 + i*10 p <- plot_usmap(data = filter(Database, year == plot_year), values = current_var) + scale_fill_continuous( low = "white", high = "blue", na.value = "light gray", label = scales::comma, name = "Legend", limits = c(var_min, var_max) ) + theme(legend.position = "right") + labs(title = str_c(labs[k], ", ", plot_year)) print(p) } }
可选优化
如果需要固定图例的刻度间隔,可以在scale_fill_continuous中添加breaks参数,写法如下:
breaks = seq(var_min, var_max, length.out = 5)
内容的提问来源于stack exchange,提问作者PierreRoubaix
相关产品推荐
相关产品推荐

