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

如何在R中使用scale_color_viridis_c指定浅蓝到深蓝的色阶?

问题解答

问题1:自定义从浅蓝到深蓝的色阶

viridis系列色阶的begin和end参数是用来截取内置色带的区间(取值0-1,对应色带的起点到终点),和RGB值没有直接的一一映射关系,靠随机调整很难精准匹配目标颜色。如果需要完全自定义从浅蓝到深蓝的色阶,推荐直接使用scale_color_gradient()(双色渐变)或scale_color_gradientn()(多色渐变),直接通过RGB值定义色阶:

  • 用scale_color_gradient()实现双色渐变:
    # 示例:从浅蓝(RGB 173,216,230)到深蓝(RGB 0,0,139),可自定义透明度
    scale_color_gradient(
      low = rgb(173, 216, 230, maxColorValue = 255), # 浅蓝
      high = rgb(0, 0, 139, maxColorValue = 255),    # 深蓝
      alpha = 0.5, # 全局透明度
      na.value = "transparent",
      guide = "colourbar"
    )
    
  • 也可以直接使用R内置的颜色名简化写法:low = "lightblue", high = "darkblue",但RGB写法能更精准控制颜色。

如果一定要用viridis色带调整到接近蓝系,可选择option = "B"(viridis的蓝系色带),再配合begin和end截取区间,但自由度不如自定义RGB色阶高。

问题2:解决legend.title报错

报错的核心原因是:theme()中的legend.title参数不能直接赋值字符串,必须通过element_text()等主题元素函数来定义文本内容和样式,直接传字符串会触发元素层级错误。

修正点:

  1. 将theme()中的legend.title="title"改为legend.title = element_text("你的标题"),还可额外设置字体大小、颜色等样式;
  2. 移除scale_colour_viridis_c()中多余的第一个参数d$tas,scale函数不需要重复传入映射变量(aes(color = d$tas)已指定);
  3. 修正拼写错误:legend.key.heigh改为legend.key.height。

修改后的完整绘图代码

ncin <- nc_open("test.nc")
# 获取经纬度
lon <- ncvar_get(ncin,"lon") 
lat <- ncvar_get(ncin,"lat", verbose=F) 
# 获取数据
masked<-ncvar_get(ncin,"hur")
mydata<-masked[,,1]
# 数据整理
permdata<-aperm(mydata,c(2,1))
gridtest<-expand.grid(lon,lat)
renametest<-rename(gridtest,lon = Var1, lat = Var2)
d <- mutate(renametest, tas = as.vector(permdata))

# 绘图(已修正两个问题)
ggplot() + 
  geom_point(aes(x = lon, y = lat, color = tas), # 直接用列名,符合ggplot2规范
             size = 0.8) + 
  lims(x = c(-10.77119, -5.230277), y = c(51.35698, 55.43612)) +     
  # 替换为自定义蓝系色阶,也可保留修正后的viridis用法
  scale_color_gradient(
    low = rgb(173,216,230, maxColorValue=255),
    high = rgb(0,0,139, maxColorValue=255),
    alpha = 0.5,
    na.value = "transparent",
    guide = "colourbar"
  ) +    
  theme(
    legend.direction="vertical", 
    legend.position="right", 
    legend.key.width=unit(0.4,"cm"), 
    legend.key.height=unit(2,"cm"), 
    legend.title = element_text("湿度", size=12) # 修正后的legend.title写法
  ) + 
  coord_quickmap(clip = "on") + 
  ggtitle("2005年1月1日湿度分布") 

内容的提问来源于stack exchange,提问作者matlabcat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 14:30:06