如何调整簇状geom_col的填充顺序以匹配图例顺序?
问题原因
你在scale_fill_brewer中设置的limits参数仅能调整图例的展示顺序,不会改变Season变量本身的因子水平,而簇状条形的排列优先级由变量的因子水平决定。Season默认会按照字母顺序排序(Autumn首字母A最靠前,会排在每组第一个),因此会出现条形顺序与图例顺序不匹配的问题。
解决方法
方案1(推荐):预处理数据,提前定义因子顺序
在调用ggplot前,先将Season转换为指定顺序的有序因子,后续绘图会直接沿用该顺序:
# 指定Season的因子水平,顺序和你需要的图例/条形顺序完全匹配 data1day$Season <- factor(data1day$Season, levels = c("Summer", "Autumn", "Winter", "Spring"))
预处理完成后,简化原ggplot代码即可,无需额外调整scale参数,也不需要用arrange排序数据:
plot <- ggplot(data1day, aes(x = Set, y = 100 * Density, fill = Season)) + geom_col(position = 'dodge', color = 'black') + theme_classic() + labs(x = "Subset of sites surveyed", y = "Density (%)") + scale_x_discrete(limits = c("Full set", "Set 2", "Set 3", "Set 4")) + scale_fill_brewer(palette = "Set2") + theme(text = element_text(size = 14, family = "serif", colour = "black")) + theme(axis.text.x = element_text(colour = "black")) + theme(axis.text.y = element_text(colour = "black"))
方案2:不修改原数据,直接在绘图逻辑中指定顺序
如果你不想改动原数据集,可以直接在aes的fill参数中定义因子顺序,效果和方案1一致:
plot <- ggplot(data1day, aes(x = Set, y = 100 * Density, fill = factor(Season, levels = c("Summer", "Autumn", "Winter", "Spring")))) + geom_col(position = 'dodge', color = 'black') + theme_classic() + labs(x = "Subset of sites surveyed", y = "Density (%)", fill = "Season") + scale_x_discrete(limits = c("Full set", "Set 2", "Set 3", "Set 4")) + scale_fill_brewer(palette = "Set2") + theme(text = element_text(size = 14, family = "serif", colour = "black")) + theme(axis.text.x = element_text(colour = "black")) + theme(axis.text.y = element_text(colour = "black"))
两种方案运行后,每组的条形顺序都会和图例顺序完全对齐,颜色和数值的对应关系也不会发生变化。
内容的提问来源于stack exchange,提问作者Tormey R
相关产品推荐
相关产品推荐

