使用scale_fill_manual修改R ggplot柱状图指定柱子颜色的问题
问题:ggplot2柱状图指定单根柱子颜色失败,所有柱子变灰色
我基于如下数据框df绘制柱状图,希望将“Britain”对应的柱子设为浅蓝色(lightblue),其余设为钢蓝色(steel blue):
t first_column second_column ToHighlight 1 Britain 32.5 yes 2 Australia 69.8 no 3 United States 293.1 no 4 Canada 70.1 no
其中ToHighlight列用于通过scale_fill_manual设置颜色区分。
以下代码能将所有柱子设为钢蓝色,正常渲染图表:
economist <- ggplot(df, aes(x=reorder(first_column, +second_column),y = second_column)) + geom_bar(stat="identity", fill = "steel blue") + coord_flip() + ggtitle("Size matters", subtitle = "Average total holdings of the ten largest pension funds in billions of US dollars, selected countries") + theme_economist() + theme(text = element_text(family = "Verdana")) + theme(axis.title.y = element_blank())
但尝试用以下代码单独将Britain柱子设为浅蓝色时,所有柱子变成默认灰色,求修正方法:
economist <- ggplot(df, aes(x=reorder(first_column, +second_column),y = second_column)) + geom_bar(stat="identity") + scale_fill_manual(values=c("yes"="lightblue", "no"="steel blue", guide = FALSE)) + coord_flip() + ggtitle("Size matters", subtitle = "Average total holdings of the ten largest pension funds in billions of US dollars, selected countries") + theme_economist() + theme(text = element_text(family = "Verdana")) + theme(axis.title.y = element_blank())
解决方案
错误原因与修正步骤
- 未绑定填充映射:要让
scale_fill_manual生效,必须在ggplot的aes参数中指定fill = ToHighlight,明确告知ggplot根据哪一列的值区分填充颜色。原代码缺少这一映射,导致颜色规则未被应用,柱子使用默认灰色。 - 参数位置错误:
guide = FALSE是scale_fill_manual的独立参数,不能嵌套在values的颜色向量中,需单独作为参数传入。
修正后的完整代码
economist <- ggplot(df, aes(x=reorder(first_column, +second_column), y = second_column, fill = ToHighlight)) + # 新增填充映射 geom_bar(stat="identity") + scale_fill_manual(values=c("yes"="lightblue", "no"="steel blue"), # 分离guide参数 guide = FALSE) + coord_flip() + ggtitle("Size matters", subtitle = "Average total holdings of the ten largest pension funds in billions of US dollars, selected countries") + theme_economist() + theme(text = element_text(family = "Verdana")) + theme(axis.title.y = element_blank())
内容的提问来源于stack exchange,提问作者Learner_24
相关产品推荐
相关产品推荐

