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
相关产品推荐
相关产品推荐

