离散值场景下geom_ribbon与geom_line绘图问题及报错解决
搞定你的ggplot折线图与填充区域问题
没问题,我来帮你解决这几个ggplot使用时遇到的问题!先理清楚你的场景,再逐个击破:
你的数据与现有代码
首先,把你的数据整理成清晰的CSV格式(方便后续使用):
Month,Open,Closed 2017-08,53,38 2017-09,102,85 2017-10,58,38 2017-11,51,42 2017-12,32,24 2018-01,24,30 2018-02,56,46 2018-03,82,74 2018-04,95,89 2018-05,16,86
你当前的基础绘图代码:
ggplot() + geom_line(data=issues.m,aes(x=Month,y=Open,group=1)) + geom_line(data=issues.m,aes(x=Month,y=Closed,group=1)) + geom_ribbon(data=issues.m, aes(x=Month,ymin=Closed,ymax=Open,color=Open-Closed)) + theme_tufte() + theme(axis.text.x = element_text(angle = 90, hjust = 1))
问题1:完全填充两条线之间的区域
你现在犯了个小误区:geom_ribbon里的color参数是用来设置边框线条颜色的,要填充区域得用fill参数才行!
如果只是想要单一颜色填充,直接把fill放在aes外面就行,再加个alpha让填充色更柔和(避免挡住折线):
geom_ribbon(data=issues.m, aes(x=Month, ymin=Closed, ymax=Open), fill="lightblue", alpha=0.7)
要是想根据Open-Closed的差值来填充不同颜色,就把fill映射到这个差值(放在aes里):
geom_ribbon(data=issues.m, aes(x=Month, ymin=Closed, ymax=Open, fill=Open-Closed), alpha=0.7)
问题2:为折线加颜色时的错误
你遇到的Error: Continuous value supplied to discrete scale,是因为你在aes里写了color='open'——ggplot会把这个字符串当成连续变量处理,但默认的颜色尺度是离散的,所以就冲突了。给你两种解决办法:
方法1:直接指定固定颜色(简单粗暴)
把color移出aes,直接给每条线设置颜色:
ggplot() + geom_line(data=issues.m,aes(x=Month,y=Open,group=1), color="#E64B35") + # 用红色标Open geom_line(data=issues.m,aes(x=Month,y=Closed,group=1), color="#3182BD") + # 用蓝色标Closed geom_ribbon(data=issues.m, aes(x=Month,ymin=Closed,ymax=Open,fill=Open-Closed), alpha=0.7) + theme_tufte() + theme(axis.text.x = element_text(angle = 90, hjust = 1))
方法2:用颜色映射+手动尺度(带图例更规范)
如果想要保留图例,建议先把数据转成长格式,再用颜色映射:
# 先转长格式(需要tidyr包) issues_long <- tidyr::pivot_longer(issues.m, cols=c(Open, Closed), names_to="Type", values_to="Count") ggplot(issues_long, aes(x=Month, y=Count, color=Type, group=Type)) + geom_line() + # 因为ribbon用的是原宽格式数据,要加inherit.aes=FALSE避免冲突 geom_ribbon(data=issues.m, aes(x=Month, ymin=Closed, ymax=Open, fill=Open-Closed), alpha=0.7, inherit.aes=FALSE) + scale_color_manual(values=c("Open"="#E64B35", "Closed"="#3182BD")) + # 手动指定颜色 theme_tufte() + theme(axis.text.x = element_text(angle = 90, hjust = 1))
这种方式更符合ggplot的设计逻辑,后续调整也更方便。
修改geom_ribbon的调色板
因为Open-Closed是连续数值,我们可以用连续调色板来定制填充色:
- 用默认渐变:
scale_fill_gradient(low="white", high="red") - 色盲友好的viridis调色板:
scale_fill_viridis_c(option="magma")(推荐!) - 正负差值区分的渐变:
scale_fill_gradient2(low="blue", mid="white", high="red", midpoint=0)(适合有正有负的差值)
举个viridis的例子:
ggplot() + geom_line(data=issues.m,aes(x=Month,y=Open,group=1), color="#E64B35") + geom_line(data=issues.m,aes(x=Month,y=Closed,group=1), color="#3182BD") + geom_ribbon(data=issues.m, aes(x=Month,ymin=Closed,ymax=Open,fill=Open-Closed), alpha=0.7) + scale_fill_viridis_c(name="Open-Closed差值", option="plasma") + # 自定义调色板+图例名称 theme_tufte() + theme(axis.text.x = element_text(angle = 90, hjust = 1))
内容的提问来源于stack exchange,提问作者jjmerelo
相关产品推荐
相关产品推荐

