如何使用ggplot实现曲线下区域按光谱颜色渐变填充
ggplot2 曲线下填充可见光谱渐变效果实现方案
方案1:优化 geom_segment 实现(无需额外依赖,兼容性最好)
你最初的 geom_segment 思路是可行的,问题出在颜色映射规则没有匹配可见光波长对应色值,修改后代码如下:
library(ggplot2) library(scales) ggplot(bq, aes(x=w.length, y=s.e.irrad)) + geom_segment(aes(xend=w.length, yend=0, colour = w.length), linewidth = 1.2) + geom_line(colour = "black", linewidth = 0.8) + # 自定义色阶匹配可见光谱:380nm紫光→720nm红光 scale_colour_gradientn( colours = c("#9400D3", "#4B0082", "#0000FF", "#00FFFF", "#00FF00", "#FFFF00", "#FF7F00", "#FF0000"), values = rescale(c(380, 420, 450, 490, 550, 590, 630, 720)), guide = "none" ) + labs(x = "波长(nm)", y = "辐照度") + theme_minimal()
注:如果你的数据中波长采样点比较稀疏,调大 linewidth 参数即可消除竖线间隙,实现平滑填充效果。
方案2:光谱数据专用实现(适配辐照度类数据场景)
如果你的数据是光谱相关数据,可以直接用photobiologyPlots包的内置光谱色映射,代码更简洁:
# 首次使用先安装依赖包 # install.packages(c("photobiology", "photobiologyPlots")) library(photobiology) library(photobiologyPlots) # 转换为光谱专属数据格式 bq_spct <- source_spct(bq, w.length = "w.length", s.e.irrad = "s.e.irrad") ggplot(bq_spct, aes(w.length, s.e.irrad)) + stat_wl_bar(ymax = s.e.irrad, fill = "auto") + geom_line(colour = "black", linewidth = 0.8) + labs(x = "波长(nm)", y = "辐照度") + theme_minimal()
内容的提问来源于stack exchange,提问作者Mauro
相关产品推荐
相关产品推荐

