ggplot2中带发散色的Barplot(柱状图)颜色未正常显示问题求助
问题原因与解决方案
你的柱状图始终显示灰色,核心问题在于没有将fill(填充色)美学属性与你的Height变量绑定——scale_fill_gradient2是用来定义颜色渐变规则的,但你得先告诉ggplot:“用哪个数据来决定柱子的颜色”,否则它只会使用默认的灰色样式。
具体原因拆解:
- 你的
ggplot(aes())里只定义了x和y的映射关系,没有指定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" )
关键改动说明:
- 在
ggplot(aes())中添加fill = Height,把填充色和身高数据绑定,让scale_fill_gradient2有了作用的目标对象。 - 去掉了重复的
as.numeric(Height)——从你的str(d)结果来看,Height已经是数值类型,无需重复转换。 - 给
scale_fill_gradient2补充了midpoint = mean(d$Height),让黄色对应所有国家的平均身高,这样红色(低于平均)、黄色(平均)、绿色(高于平均)的发散逻辑更直观(你也可以根据需求改成固定值,比如175cm)。
修改后,柱子就会根据身高值呈现从红到黄到绿的渐变效果了。
内容的提问来源于stack exchange,提问作者Gaspar




