R语言ggplot2绘图时如何固定X轴标签为数据框原有顺序
ggplot2 固定X轴为数据原始顺序(保留原图例配色)
问题描述
需要让X轴标签按照数据框中的原有顺序排列,而非默认自动按字母顺序重排,当前效果如下:
原始复现代码
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 |> dplyr::mutate(colour = fct_reorder(Methods, RMSE)) |> ggplot2::ggplot(aes(Methods, RMSE, colour = colour)) + ggplot2::geom_point(size = 4) + ggplot2::geom_segment(aes(Methods, xend = Methods, yend = RMSE, y = 0)) + ggplot2::scale_color_manual(values = c("green", "yellowgreen", "yellow", "orange", "red"), labels = c(9, 8, 9, 9, 4), name = "lb") + ggplot2::theme_bw(base_size = 16)
需求说明
- X轴标签严格按照
nbb_RMSE、mbb_RMSE、cbb_RMSE、tmbb_RMSE、tcbb_RMSE在数据框中出现的先后顺序排列 - 保持原有图例完全不变,颜色梯度维持从绿色到红色的规则
- 常规的按值排序离散轴、全局调整因子顺序的方案在当前场景下不生效,会破坏原有图例的颜色映射逻辑
解决方案
问题根源是:ggplot2 对离散轴的排序完全遵循映射变量的因子水平顺序,传入字符型变量时会默认自动按字母顺序生成因子水平,导致排序不符合预期。原有代码仅调整了颜色映射列的因子顺序,没有处理X轴映射的Methods列,且如果直接全局修改Methods的因子顺序,会打乱颜色映射的对应关系,导致图例配色错乱。
只需要在mutate步骤中单独为X轴映射的Methods列设置按原始行序排列的因子水平,不改动颜色映射列的原有排序逻辑即可,修改后代码如下:
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 |> dplyr::mutate( # 核心修改:仅设置X轴Methods的因子水平为数据原始出现顺序 Methods = factor(Methods, levels = unique(Methods)), # 颜色映射列保持原有按RMSE排序的逻辑,完全不改动 colour = fct_reorder(Methods, RMSE) ) |> ggplot2::ggplot(aes(Methods, RMSE, colour = colour)) + ggplot2::geom_point(size = 4) + ggplot2::geom_segment(aes(Methods, xend = Methods, yend = RMSE, y = 0)) + ggplot2::scale_color_manual(values = c("green", "yellowgreen", "yellow", "orange", "red"), labels = c(9, 8, 9, 9, 4), name = "lb") + ggplot2::theme_bw(base_size = 16)
运行后X轴会严格按照数据框原始顺序排列,原有图例的颜色、标签、名称都不会发生任何变化。
内容的提问来源于stack exchange,提问作者Daniel James
相关产品推荐
相关产品推荐

