You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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生成的颜色向量,具体步骤:

  1. 安装并加载viridis包
  2. 用viridis()函数生成对应数量的颜色(此处为3个区域,生成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:55:25