You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ggplot2中带发散色的Barplot(柱状图)颜色未正常显示问题求助

问题原因与解决方案

你的柱状图始终显示灰色,核心问题在于没有将fill(填充色)美学属性与你的Height变量绑定——scale_fill_gradient2是用来定义颜色渐变规则的,但你得先告诉ggplot:“用哪个数据来决定柱子的颜色”,否则它只会使用默认的灰色样式。

具体原因拆解:

  • 你的ggplot(aes())里只定义了xy的映射关系,没有指定fill = Height,导致scale_fill_gradient2没有可作用的数据对象,自然无法触发颜色渐变效果。
  • 即便使用stat = "identity"geom_bar也不会自动把y轴变量作为填充色的依据,必须手动声明填充色的映射规则。

修复后的完整代码:

d %>% 
  ggplot(aes(x = reorder(Entity, Height), y = Height, fill = Height)) +  # 新增fill与Height的绑定
  geom_bar(stat = "identity") + 
  coord_flip() + 
  theme_clean() + 
  theme(legend.position = "none", plot.title = element_text(hjust = 0.5)) + 
  labs(y = "Height in cm", x = "", title = "Average Human Height of Men for Selected Countries, 1980", caption = "Our World in Data") + 
  geom_text(aes(label = Height), col = "black", size = 2.5, hjust = 1.1) + 
  scale_fill_gradient2(
    low = "red", 
    mid = "yellow", 
    high = "green", 
    midpoint = mean(d$Height),  # 手动设置中点为所有国家的平均身高,让发散逻辑更合理
    aesthetics = "fill"
  )

关键改动说明:

  1. ggplot(aes())中添加fill = Height,把填充色和身高数据绑定,让scale_fill_gradient2有了作用的目标对象。
  2. 去掉了重复的as.numeric(Height)——从你的str(d)结果来看,Height已经是数值类型,无需重复转换。
  3. scale_fill_gradient2补充了midpoint = mean(d$Height),让黄色对应所有国家的平均身高,这样红色(低于平均)、黄色(平均)、绿色(高于平均)的发散逻辑更直观(你也可以根据需求改成固定值,比如175cm)。

修改后,柱子就会根据身高值呈现从红到黄到绿的渐变效果了。

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

火山引擎 最新活动