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

如何在R中按X值为geom_ribbon填充不同颜色并补全空缺?

解决geom_ribbon填充空缺的问题

你的geom_ribbon出现空缺,核心原因是原始数据的Temp是离散的少数点,跨区间的相邻点之间没有连续数据支撑,导致区间衔接处出现空白。解决思路是先对数据进行插值,生成连续的Temp序列,再基于连续数据填充区间颜色。

完整代码

library(tidyverse)

# 原始数据
df = structure(list(Temp = c(10, 13, 17, 20, 25, 28, 30, 32, 35, 38), 
                    Growth.rate = c(0, 0.02, 0.19, 0.39, 0.79, 0.96, 1, 0.95, 0.65, 0), 
                    slope = c(0, 0.02, 0.16, 0.2, 0.39, 0.1, 0.03, -0.04, -0.29, -0.65)), 
               row.names = c(NA, 10L), class = "data.frame")

# 生成连续Temp序列并插值
interp_df <- tibble(Temp = seq(min(df$Temp), max(df$Temp), by = 0.1)) %>%
  mutate(
    Growth.rate = approx(df$Temp, df$Growth.rate, xout = Temp)$y,
    slope = approx(df$Temp, df$slope, xout = Temp)$y,
    ymax = pmax(Growth.rate, slope),
    ymin = pmin(Growth.rate, slope),
    x_bins = cut(Temp, breaks = c(0, 20, 30.1, max(df$Temp)+5))
  )

# 绘图
ggplot(df, aes(x = Temp, y = Growth.rate)) +
  geom_line(colour = "blue") +
  geom_line(aes(y = slope), colour = "red") +
  scale_y_continuous(sec.axis = sec_axis(~ ., name = "slope")) +
  geom_ribbon(data = interp_df, aes(Temp, ymin = ymin, ymax = ymax, fill = x_bins), 
              alpha = 0.4) +
  labs(fill = "Temperature Range")

关键说明

  • 用seq生成连续的Temp序列,间隔0.1可根据需求调整,数值越小填充越平滑。
  • approx函数对Growth.rate和slope做线性插值,确保每个连续Temp点都有对应的y值。
  • 插值后的数据足够密集,geom_ribbon就能完整覆盖所有区间,不会出现空缺。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:20:46