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

使用forcats::fct_infreq重排因子后匹配自定义调色板的问题

问题:因子按频率排序后自定义调色板匹配失效

我使用geom_histogram展示调研数据,希望通过forcats::fct_infreq按因子出现频率排序Y轴。使用了匹配主题的自定义调色板,但排序后调色板与因子的对应关系混乱,尝试重新排序调色板匹配因子顺序也无效。示例代码及效果如下:

示例代码与初始效果

数据与调色板定义

library(tidyverse)

df <- tibble(
  response = c(1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6,6,7,7,7,7,7,7,8,8,8,8,8,9,9,9,9,9,10, 10,10, 10,10, 10,10, 10,11, 12,12, 12,12, 12,13, 13,13, 13,13, 14,14, 14,14, 14,14, 14,14, 14,14, 15,15, 15,16, 16,17, 17,17, 18,18, 19,19, 19,20, 20,20, 20,20, 21,21, 21,21, 22,23, 23,23, 23,23, 24,24, 24,24, 25,25, 25,26, 26,27, 28,29, 29,29, 29,29, 29,30, 30,30, 30,30, 31,31, 32,32, 32,33, 33,33, 33,33, 34,34,34,34, 34,34, 34,34, 34,35, 35,35, 35,35, 35,36, 36,36, 36,1),
  Q4 = c("Ratings","Reviews","Reading challenge","Search books","My Year in Books","Shelves","Ratings","Reviews","Progress tracking","Reading challenge","Recommendations","Search books","Shelves","Ratings","Reviews","Reading challenge","Recommendations","Search books","Explore","My Year in Books","Ratings","Reviews","Progress tracking","Search books","Lists","Shelves","Ratings","Reading challenge","Lists","My Year in Books","Ratings","Reviews","Progress tracking","Reading challenge","Recommendations","Search books","My Year in Books","Shelves","Ratings","Reviews","Reading challenge","Search books","My Year in Books","Ratings","Reviews","Groups","Lists","Explore","Ratings","Reading challenge","Search books","Lists","My Year in Books","Ratings","Reviews","Progress tracking","Reading challenge","Recommendations","Search books","Explore","My Year in Books","Search books","Ratings","Reviews","Progress tracking","Reading challenge","Search books","Progress tracking","Reading challenge","Recommendations","Search books","My Year in Books","Shelves","Ratings","Reviews","Progress tracking","Groups","Reading challenge","Recommendations","Search books","Lists","My Year in Books","Ratings","Groups","Reading challenge","Reviews","Recommendations","Ratings","Reviews","Search books","Ratings","Reviews","Shelves","Search books","My Year in Books","Shelves","Ratings","Reviews","Progress tracking","Search books","Shelves","Ratings","Search books","Lists","Shelves","Ratings","Reviews","Progress tracking","Search books","Lists","Ratings","Reviews","Progress tracking","Recommendations","Ratings","Reviews","Progress tracking","Shelves","Progress tracking","Search books","Progress tracking","Shelves","Ratings","Reviews","Recommendations","Search books","My Year in Books","Ratings","Reviews","Recommendations","Search books","Explore","Ratings","Reviews","Progress tracking","Recommendations","Search books","Shelves","Ratings","Progress tracking","Reading challenge","Search books","Shelves","Ratings","Reviews","Progress tracking","Recommendations","Search books","Lists","Explore","My Year in Books","Shelves","Ratings","Reviews","Reading challenge","Search books","Lists","Shelves","Ratings","Reviews","Recommendations","Scan books at library/bookstores")
  ) %>% 
  mutate_if(is.character, factor)

palette <- c('#e9e5cd', '#ddd6bb', '#d1c7aa', '#c4b89a', '#b8a98a', '#ac9b7b', '#9f8d6d', '#937f60', '#8d6f52', '#885f3b', '#7f5025', '#75420e')

因子顺序错误但调色板匹配正确

df %>% 
  ggplot(aes(y=Q4, fill=Q4))+
  geom_histogram(stat="count")+
  scale_fill_manual(values=palette)+
  theme(legend.position = "none")

因子顺序不正确的图表

因子顺序正确但调色板匹配混乱

df %>% 
  ggplot(aes(y=forcats::fct_infreq(Q4), fill=Q4))+
  geom_histogram(stat="count")+
  scale_fill_manual(values=palette)+
  theme(legend.position = "none")

因子顺序正确但调色板混乱的图表


解决方案

核心问题是:仅在aes(y=...)中临时修改因子顺序时,fill=Q4仍绑定原因子的水平顺序,导致调色板与排序后的因子错位。只需让y轴和fill使用同一个排序后的因子即可解决。

方案1:提前在数据层重排因子(推荐)

先在数据中永久修改Q4的因子顺序,后续绘图直接调用即可:

# 按出现频率重新排序Q4的因子水平
df_sorted <- df %>%
  mutate(Q4 = fct_infreq(Q4))

# 绘图时y和fill都使用排序后的Q4
df_sorted %>%
  ggplot(aes(y = Q4, fill = Q4)) +
  geom_histogram(stat = "count") +
  scale_fill_manual(values = palette) +
  theme(legend.position = "none")

方案2:在ggplot中统一使用排序后的因子

如果不想修改原始数据,可在aes中同时为y和fill指定排序后的因子:

df %>%
  ggplot(aes(y = fct_infreq(Q4), fill = fct_infreq(Q4))) +
  geom_histogram(stat = "count") +
  scale_fill_manual(values = palette) +
  theme(legend.position = "none")

两种方法都能保证调色板按照因子的新顺序依次匹配,解决错位问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:24:31