如何在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
相关产品推荐
相关产品推荐

