排序后scale_fill_manual失效:美国数据无法正确显示红色
问题描述
我写了下面的代码,想把美国(USA)对应的数据柱设为红色,但把数据框按val升序排序后,红色始终停留在未排序时美国数据的位置。我试过把country转成因子类型,问题还是没解决。
# 按'val'升序排序数据框 df <- df[order(df$val), ] # 绘图 p <- ggplot(data = df, aes(x = reorder(country, val), y = val, fill = country)) + geom_bar(stat = "identity") + scale_fill_manual(values = ifelse(density_df$country == "USA", "red", "darkblue")) + theme_minimal()
错误效果展示:
解决方法
问题核心是scale_fill_manual里的颜色序列和排序后country的显示顺序不匹配,再加上代码里误用到了未排序的density_df(应该是df),导致颜色错位。下面给两种靠谱的解决方式:
方法一:用命名向量绑定颜色(最稳妥)
直接把颜色和国家名称绑定,不管数据怎么排序,颜色都会对应正确的国家:
# 按'val'升序排序数据框 df <- df[order(df$val), ] # 生成颜色命名向量,指定USA为红色,其余为深蓝色 color_vec <- setNames(ifelse(df$country == "USA", "red", "darkblue"), df$country) # 绘图(排序后直接用country作为x轴,无需reorder) p <- ggplot(data = df, aes(x = country, y = val, fill = country)) + geom_bar(stat = "identity") + scale_fill_manual(values = color_vec) + theme_minimal()
方法二:匹配排序后的因子顺序
如果坚持用reorder,先提取排序后的国家顺序,再生成对应颜色:
# 按'val'升序排序数据框 df <- df[order(df$val), ] # 获取排序后的国家因子顺序 sorted_countries <- reorder(df$country, df$val) # 根据排序后的因子水平生成颜色 colors <- ifelse(levels(sorted_countries) == "USA", "red", "darkblue") # 绘图 p <- ggplot(data = df, aes(x = sorted_countries, y = val, fill = sorted_countries)) + geom_bar(stat = "identity") + scale_fill_manual(values = colors) + labs(x = "country") + # 把x轴标签改回原名称 theme_minimal()
关键注意点
- 代码里的
density_df是笔误,必须替换为排序后的df ggplot的填充颜色会严格遵循fill变量的因子顺序,所以颜色序列必须和这个顺序完全对应- 用命名向量绑定颜色和国家,是避免顺序错位的最优方案
内容的提问来源于stack exchange,提问作者Rnewbie
相关产品推荐
相关产品推荐

