R语言ggplot2绘制棒棒糖图 如何修改颜色图例为lb列取值
ggplot2 替换图例标签为数据框其他列对应值
问题场景
需要在ggplot2绘图时,将分类颜色图例的标签替换为数据框中另一列的对应取值,初始绘图代码如下:
library(tidyverse) df1 <- read.table(text = "nbb_RMSE 9 0.2402482 mbb_RMSE 9 0.1023012 cbb_RMSE 8 0.2031448 tmbb_RMSE 4 0.2654746 tcbb_RMSE 9 0.4048711") colnames(df1) <- c("Methods", "lb", "RMSE") df1 |> mutate(colour = fct_reorder(Methods, RMSE)) |> ggplot(aes(Methods, RMSE, colour = colour)) + geom_point(size = 4) + geom_segment(aes(Methods, xend = Methods, yend = RMSE, y = 0)) + scale_color_manual(values = c("green", "yellowgreen", "yellow", "orange", "red")) + theme_bw()
初始代码运行效果:
具体需求
lb列与按RMSE升序排列的颜色映射对应规则如下:
- 最小RMSE对应的绿色,匹配lb列取值9
- 次小RMSE对应的黄绿色,匹配lb列取值8
- 黄色匹配lb列取值9
- 橙色匹配lb列取值4
- 最大RMSE对应的红色,匹配lb列取值9
需要将颜色图例的标签替换为上述对应的lb列取值,期望效果:
实现方法
核心逻辑是在scale_color_manual中通过labels参数,传入和颜色映射顺序一一对应的标签值即可,同时可以通过labs()修改图例标题让语义更统一。
方法1:手动指定标签顺序
先确认fct_reorder排序后因子的顺序是按RMSE从小到大排列:mbb_RMSE、cbb_RMSE、nbb_RMSE、tmbb_RMSE、tcbb_RMSE,对应lb值依次为9、8、9、4、9,直接传入标签向量即可:
library(tidyverse) df1 <- read.table(text = "nbb_RMSE 9 0.2402482 mbb_RMSE 9 0.1023012 cbb_RMSE 8 0.2031448 tmbb_RMSE 4 0.2654746 tcbb_RMSE 9 0.4048711") colnames(df1) <- c("Methods", "lb", "RMSE") df1 |> mutate(colour = fct_reorder(Methods, RMSE)) |> ggplot(aes(Methods, RMSE, colour = colour)) + geom_point(size = 4) + geom_segment(aes(Methods, xend = Methods, yend = RMSE, y = 0)) + scale_color_manual( values = c("green", "yellowgreen", "yellow", "orange", "red"), labels = c("9", "8", "9", "4", "9") ) + labs(color = "lb") + theme_bw()
方法2:自动提取对应标签避免手动出错
如果数据量较大,手动写标签容易出现顺序错误,可以在绘图前按因子顺序排列数据,直接提取对应lb列作为标签向量:
library(tidyverse) df1 <- read.table(text = "nbb_RMSE 9 0.2402482 mbb_RMSE 9 0.1023012 cbb_RMSE 8 0.2031448 tmbb_RMSE 4 0.2654746 tcbb_RMSE 9 0.4048711") colnames(df1) <- c("Methods", "lb", "RMSE") df1 |> mutate(colour = fct_reorder(Methods, RMSE)) |> (\(plot_data) { ggplot(plot_data, aes(Methods, RMSE, colour = colour)) + geom_point(size = 4) + geom_segment(aes(Methods, xend = Methods, yend = RMSE, y = 0)) + scale_color_manual( values = c("green", "yellowgreen", "yellow", "orange", "red"), labels = arrange(plot_data, colour)$lb ) + labs(color = "lb") + theme_bw() })()
运行上述代码即可得到和期望一致的图例效果。
内容的提问来源于stack exchange,提问作者Daniel James
相关产品推荐
相关产品推荐

