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

ggplot使用geom_contour_filled搭配scale_fill_brewer无图例如何解决

图例消失原因

你代码中geom_contour_filled设置的等高线断点为zCuts*0.1,但scale_fill_brewer中传入的断点为原始zCuts,两者数值范围完全不匹配,ggplot无法将填充色映射到对应图例断点,因此不会显示图例。

修复代码

只需要统一两者的断点即可,如果你需要图例显示乘0.1后的数值,直接修改scale_fill_brewer的breaks参数:

limits = c(-1,1)*max(abs(sing2$qbo),na.rm=TRUE)
zCuts <-  round(seq(limits[1], limits[2], length.out = 11), digits=0)

sing2 %>% 
  ggplot() +
  geom_contour_filled(aes(x=date,y=hpa, z = qbo*0.1),breaks=zCuts*0.1, show.legend = TRUE) +
  scale_y_reverse(expand=c(0,0)) +
  scale_x_date(expand=c(0,0), date_breaks = '1 year', date_labels = '%Y') + 
  # 此处breaks改为和geom一致的zCuts*0.1,palette用配色名更稳妥
  scale_fill_brewer(palette = "RdBu", type='div', breaks=zCuts*0.1) +
  theme_bw() + 
  theme(legend.position = 'right',
        axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

如果你希望图例显示原始qbo的数值(不显示乘0.1之后的结果),可以给scale_fill_brewer增加labels参数做映射:

scale_fill_brewer(palette = "RdBu", type='div', breaks=zCuts*0.1, labels = zCuts)

额外优化提示:你当前代码中对sing2做了两次赋值,第二次的赋值覆盖了第一次按1997年前后区分行计数的处理逻辑,如果需要准确对应年份数据,建议删除第二次的sing2赋值代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:09:02