如何为R语言spplot配置viridis配色方案?
问题描述
大学项目中需要制作spplot地图,需将老师提供的默认配色替换为viridis系列调色板。以下是强制要求的初始代码及尝试过的失败方法:
初始强制代码
library(sp) mapa = readRDS("gadm36_ESP_2_sp.rds") names(mapa) mapa$NAME_1 Com_Val<-mapa[mapa$NAME_1=="Comunidad Valenciana",] Com_Val$cantidad<-c(29,10,65) # 上述数字为绘图配色依据,可自行选择数值 spplot(Com_Val,"cantidad")
执行后得到的默认配色绘图:
失败的尝试方法
直接赋值十六进制颜色代码
Com_Val$cantidad<-c("#44015499","#3B528B99","#21908C99")
报错:
Error in seq.default(zrng[1], zrng[2], length.out = cuts + 2) : 'from' must be a finite number In addition: Warning messages: 1: In extend.limits(range(as.numeric(z), finite = TRUE)) : NAs introduced by coercion 2: In min(x) : no non-missing arguments to min; returning Inf 3: In max(x) : no non-missing arguments to max; returning -Inf
直接赋值RGB颜色代码
Com_Val$cantidad<-c(rgb(255, 87, 51),rgb(59, 82, 139),rgb(33, 144, 140))
报错:
> Com_Val$cantidad<-c(rgb(255, 87, 51),rgb(59, 82, 139),rgb(33, 144, 140)) Error in rgb(255, 87, 51) : color intensity 51, not in [0,1] > spplot(Com_Val,"cantidad") Error in seq.default(zrng[1], zrng[2], length.out = cuts + 2) : 'from' must be a finite number In addition: Warning messages: 1: In extend.limits(range(as.numeric(z), finite = TRUE)) : NAs introduced by coercion 2: In min(x) : no non-missing arguments to min; returning Inf 3: In max(x) : no non-missing arguments to max; returning -Inf >
尝试添加ggplot2的viridis缩放函数
Com_Val$cantidad<-c(29,10,65) spplot(Com_Val,"cantidad")+ scale_color_viridis(alpha=1,discrete=TRUE, option="D")
报错:
NULL
(使用scale_fill_viridis会得到相同错误)
需求:如何在保留初始代码结构的前提下修改配色为viridis?若无法实现,还有其他可行方法吗?
解决方案
方法一:保留spplot结构,使用viridis调色板
spplot属于sp包的绘图函数,不兼容ggplot2的scale_*系列函数。要替换配色,需通过col.regions参数传入viridis生成的颜色向量,具体步骤:
- 安装并加载viridis包
- 用
viridis()函数生成对应数量的颜色(此处为3个区域,生成3种颜色) - 在
spplot中传入col.regions参数
修改后的完整代码:
library(sp) library(viridis) # 加载viridis包 mapa = readRDS("gadm36_ESP_2_sp.rds") names(mapa) mapa$NAME_1 Com_Val<-mapa[mapa$NAME_1=="Comunidad Valenciana",] Com_Val$cantidad<-c(29,10,65) # 生成viridis调色板颜色,n对应区域数量,option可选"A"-"E" viridis_cols <- viridis(n = 3, option = "D") # 传入col.regions参数替换配色 spplot(Com_Val,"cantidad", col.regions = viridis_cols)
如果是连续数值变量,可调整viridis()的n参数生成渐变颜色:
# 连续数值示例,生成10种渐变颜色 viridis_cols <- viridis(n = 10, option = "C") spplot(Com_Val,"cantidad", col.regions = viridis_cols)
方法二:转换为sf对象,用ggplot2+viridis绘图(替代方案)
若允许偏离sp包的spplot,可将sp对象转换为sf对象,使用更灵活的ggplot2语法配合viridis:
library(sp) library(sf) library(ggplot2) library(viridis) mapa = readRDS("gadm36_ESP_2_sp.rds") Com_Val<-mapa[mapa$NAME_1=="Comunidad Valenciana",] Com_Val$cantidad<-c(29,10,65) # 转换sp对象为sf对象 Com_Val_sf <- st_as_sf(Com_Val) # ggplot绘图+viridis填充 ggplot(Com_Val_sf) + geom_sf(aes(fill = cantidad)) + scale_fill_viridis(discrete = FALSE, option = "D") + # discrete根据变量类型调整 theme_minimal()
内容的提问来源于stack exchange,提问作者Beatriz
相关产品推荐
相关产品推荐

