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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:45:04