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

ggplot2:为轴标签添加彩色方形标识并保留原始顺序

问题:保留带彩色方块的x轴标签原始顺序

原始代码(MWE)

这段代码生成折线图,x轴标签保持colors()[1:8]的原始顺序:

set.seed(2022102517)
df <- data.frame(letter = factor(colors()[1:8], levels = colors()[1:8]), value = rnorm(8))
library(ggplot2)
ggplot(data = df, aes(x = letter, y = value, group = 1)) + geom_line()

需求

需要在x轴每个颜色名称左侧添加对应fill.col中指定颜色的填充方块,同时保留x轴标签的原始顺序:

fill.col <- c("#005A32", "#FC8D62", "#D95F02", "#8DA0CB", "#7570B3", "#E78AC3", "#E7298A", "#A6D854")

尝试的方法(存在问题)

以下代码成功添加了彩色方块,但x轴标签被按字母顺序重新排列:

library(tidyverse)
library(RColorBrewer)
library(ggtext)

df %>% 
  mutate(new_letter = paste("<span style = 'color: ",
                            fill.col,
                            ";'>",
                            "■",
                            "</span>",
                            " ",
                            letter,
                            sep = ""), 
         new_letter = fct_reorder(new_letter, as.character(letter))) %>%
  ggplot(aes(new_letter, value, group = 1)) + 
  geom_line() + 
  theme(axis.text.x = element_markdown(size = 12))

解决方案

方法1:基于原始因子水平生成新标签的因子顺序

直接利用原始letter因子的水平,生成new_letter对应的因子水平,完全匹配原始顺序:

library(tidyverse)
library(ggtext)

set.seed(2022102517)
df <- data.frame(letter = factor(colors()[1:8], levels = colors()[1:8]), value = rnorm(8))
fill.col <- c("#005A32", "#FC8D62", "#D95F02", "#8DA0CB", "#7570B3", "#E78AC3", "#E7298A", "#A6D854")

df %>% 
  mutate(
    # 生成带彩色方块的标签文本
    new_letter = paste0("<span style='color:", fill.col, ";'>■</span> ", letter),
    # 基于原始letter的水平,设置new_letter的因子水平
    new_letter = factor(new_letter, levels = paste0("<span style='color:", fill.col, ";'>■</span> ", levels(letter)))
  ) %>%
  ggplot(aes(new_letter, value, group = 1)) + 
  geom_line() + 
  theme(axis.text.x = element_markdown(size = 12))

方法2:使用fct_inorder继承数据中的原始顺序

由于原始数据行的顺序与letter的因子水平顺序一致,用fct_inorder()可以直接将new_letter的因子水平设置为数据中出现的顺序,避免字母排序:

library(tidyverse)
library(ggtext)

set.seed(2022102517)
df <- data.frame(letter = factor(colors()[1:8], levels = colors()[1:8]), value = rnorm(8))
fill.col <- c("#005A32", "#FC8D62", "#D95F02", "#8DA0CB", "#7570B3", "#E78AC3", "#E7298A", "#A6D854")

df %>% 
  mutate(
    new_letter = paste0("<span style='color:", fill.col, ";'>■</span> ", letter),
    new_letter = fct_inorder(new_letter)  # 按数据行的顺序设置因子水平
  ) %>%
  ggplot(aes(new_letter, value, group = 1)) + 
  geom_line() + 
  theme(axis.text.x = element_markdown(size = 12))

问题原因说明

之前使用fct_reorder(new_letter, as.character(letter))时,as.character(letter)会将因子转为字符,然后按字符的字母顺序排序,覆盖了原始因子的自定义水平顺序。而上面两种方法都直接继承了原始数据的顺序,因此能保留x轴标签的原始排列。

内容的提问来源于stack exchange,提问作者user3236841

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:50:38