如何用R基础plot()结合viridis配色实现颜色映射与渐变图例?
用Base R实现Viridis配色的数值颜色映射与渐变图例
问题背景
原本使用ggplot2结合viridis::scale_color_viridis(option = "C")实现数值向量的颜色映射,但因项目限制需改用Base R的plot()函数,同时需要实现类似ggplot2的渐变图例。
解决方案
1. 将数值向量转换为Viridis配色的颜色向量
无需依赖ggplot2,直接用viridis包的原生函数即可完成数值到颜色的映射:
# 加载viridis包 library(viridis) set.seed(926) df <- data.frame(x. = rnorm(100), y. = rnorm(100), color. = rnorm(100)) # 创建对应option="C"的Viridis配色映射函数 viridis_pal_c <- viridis_pal(option = "C") # 将数值归一化后映射为对应颜色,逻辑与ggplot2一致 color_bins <- seq(min(df$color.), max(df$color.), length.out = 100) df$color_converted <- viridis_pal_c(100)[findInterval(df$color., color_bins)]
2. 使用Base R绘图并添加渐变图例
用plot()绘制散点图,再通过image()和坐标轴工具组合实现渐变图例:
# 绘制散点图 plot(df$x., df$y., col = df$color_converted, pch = 16, cex = 1.2, xlab = "x.", ylab = "y.", main = "Viridis Option C Color Mapping in Base R") # 添加渐变图例 # 定义图例位置与参数 legend_x <- max(df$x.) + 0.5 legend_y_min <- min(df$y.) legend_y_max <- max(df$y.) color_steps <- 100 color_seq <- viridis_pal_c(color_steps) # 绘制颜色渐变条 image(x = legend_x, y = seq(legend_y_min, legend_y_max, length.out = color_steps), z = matrix(1:color_steps, ncol = color_steps), col = color_seq, add = TRUE, axes = FALSE, xlab = "", ylab = "") # 添加数值刻度与标签 axis(side = 4, at = seq(legend_y_min, legend_y_max, length.out = 5), labels = round(seq(min(df$color.), max(df$color.), length.out = 5), 2), las = 1, line = -0.5) mtext("color.", side = 4, line = 2)
说明
viridis_pal(option = "C")生成与ggplot2中scale_color_viridis(option = "C")完全一致的配色方案,findInterval()将原始数值匹配到对应颜色区间,保证颜色映射逻辑统一。- 渐变图例通过
image()绘制连续颜色条,配合axis()添加数值刻度,还原ggplot2渐变图例的展示效果。
内容的提问来源于stack exchange,提问作者yuw444
相关产品推荐
相关产品推荐

