如何在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()等主题元素函数来定义文本内容和样式,直接传字符串会触发元素层级错误。
修正点:
- 将
theme()中的legend.title="title"改为legend.title = element_text("你的标题"),还可额外设置字体大小、颜色等样式; - 移除
scale_colour_viridis_c()中多余的第一个参数d$tas,scale函数不需要重复传入映射变量(aes(color = d$tas)已指定); - 修正拼写错误:
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
相关产品推荐
相关产品推荐

