You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 05:51:30