ggplot中是否存在可填充两条路径(非线条)间区域的geom?
解决ggplot循环数据中geom_ribbon错误连接的问题
你的核心问题是:geom_ribbon和geom_line会按x轴数值大小排序连接点,而非数据原始顺序,导致循环路径的填充区域出错;但geom_path严格按数据行顺序绘制,所以能正确展示曲线。要填充两条路径之间的区域,用geom_polygon即可解决——它会严格按输入点的顺序绘制闭合区域。
解决方案代码
library(tidyverse) DF <- tibble( Order = seq(1,20), x = c(seq(0,18,2), seq(19, 1, -2)), y = sin(4.5*(Order-1)*pi/180), sd1 = y + 1, sd2 = y - 1 ) # 构建填充区域的多边形顶点:先按顺序取sd1的点,再逆序取sd2的点,形成闭合路径 polygon_data <- bind_rows( DF %>% select(x, y = sd1), # 上边界:sd1的原始路径 DF %>% select(x, y = sd2) %>% arrange(desc(Order)) # 下边界:逆序的sd2路径,确保和上边界闭合 ) p <- ggplot(DF, aes(x=x, y=y)) + geom_polygon(data = polygon_data, aes(x=x, y=y), fill = 'lightblue', alpha = 0.2) + geom_path() + # 均值曲线 geom_path(aes(y=sd1), col = 'blue') + # 上标准差线 geom_path(aes(y=sd2), col = 'red') # 下标准差线 ggsave('plot.png', p)
关键逻辑说明
geom_polygon不需要ymin/ymax参数,直接使用按顺序排列的顶点坐标,只要顶点能形成闭合多边形,就能正确填充区域。- 把
sd1的点按原始顺序排列,再把sd2的点逆序排列,拼接后的顶点序列会从sd1起点出发,沿sd1走到终点,再沿sd2反向走回起点,刚好形成完全匹配两条geom_path路径范围的闭合区域。
内容的提问来源于stack exchange,提问作者bmacwilliams
相关产品推荐
相关产品推荐

