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

如何修改R语言ggplot堆叠条形图填充颜色以提升可读性

堆叠条形图颜色优化方案

可复现数据集

structure(list(type_de_sejour = c("Hospitalisé", "Hospitalisé", 
"Hospitalisé", "Hospitalisé", "Hospitalisé", "Hospitalisé"
), site = c("FRA", "FRA", "FRA", "FRA", "FRA", "FRA"), specialite = c("ANESTHESIE REANIMATION", 
"Autres", "CARDIO VASCULAIRE", "CHIRUGIE CARDIAQUE", "CHIRURGIE GENERALE ET VISCERALE", 
"CHIRURGIE THORACIQUE et VASCULAIRE"), proportion = c(0.000844059928254906, 
0, 0.357986917071112, 0.0880987550116058, 0.00105507491031863, 
0.0742772736864317), annee = c("2019", "2019", "2019", "2019", 
"2019", "2019")), row.names = c(NA, 6L), class = "data.frame")

问题描述

使用以下代码绘制堆叠条形图时,默认的彩虹色渐变难以区分不同科室类别,需要修改配色方案,让图表既美观又易于读取:

ggplot(NCN_hosp, aes(x = annee, y = proportion, fill = specialite)) +
   geom_bar(stat = "identity") + 
   facet_wrap(~site) +
   theme(plot.title = element_text(hjust = 0.5, vjust = 1, size = 8),
         axis.text.x = element_text(angle = 90, hjust = 0.5, size = 5),
         axis.text.y = element_text(size = 5), 
         legend.text = element_text(size = 5),
         legend.key.height = unit(0.1, "cm"), 
         panel.grid.major = element_blank(), 
         panel.grid.minor = element_blank())+
   scale_y_continuous(labels = scales::percent)

解决方案

1. 使用专业离散调色板(推荐)

这类调色板经过视觉优化,区分度高,部分还支持色盲友好:

方法1:viridis调色板(色盲友好)

先安装并加载viridis包:

install.packages("viridis")
library(viridis)

ggplot(NCN_hosp, aes(x = annee, y = proportion, fill = specialite)) +
   geom_bar(stat = "identity") + 
   facet_wrap(~site) +
   scale_fill_viridis(discrete = TRUE, option = "D") + # discrete参数适配分类变量
   theme(plot.title = element_text(hjust = 0.5, vjust = 1, size = 8),
         axis.text.x = element_text(angle = 90, hjust = 0.5, size = 5),
         axis.text.y = element_text(size = 5), 
         legend.text = element_text(size = 5),
         legend.key.height = unit(0.1, "cm"), 
         panel.grid.major = element_blank(), 
         panel.grid.minor = element_blank())+
   scale_y_continuous(labels = scales::percent)

方法2:RColorBrewer调色板

加载RColorBrewer包,选择合适的离散调色板:

install.packages("RColorBrewer")
library(RColorBrewer)

ggplot(NCN_hosp, aes(x = annee, y = proportion, fill = specialite)) +
   geom_bar(stat = "identity") + 
   facet_wrap(~site) +
   scale_fill_brewer(palette = "Set2") + # 可替换为"Paired""Dark2"等调色板
   theme(plot.title = element_text(hjust = 0.5, vjust = 1, size = 8),
         axis.text.x = element_text(angle = 90, hjust = 0.5, size = 5),
         axis.text.y = element_text(size = 5), 
         legend.text = element_text(size = 5),
         legend.key.height = unit(0.1, "cm"), 
         panel.grid.major = element_blank(), 
         panel.grid.minor = element_blank())+
   scale_y_continuous(labels = scales::percent)

2. 自定义颜色

如果需要贴合业务场景或品牌风格,可手动指定颜色:

# 为每个科室分配自定义颜色
custom_colors <- c(
  "ANESTHESIE REANIMATION" = "#1f77b4",
  "Autres" = "#949494",
  "CARDIO VASCULAIRE" = "#ff7f0e",
  "CHIRUGIE CARDIAQUE" = "#2ca02c",
  "CHIRURGIE GENERALE ET VISCERALE" = "#d62728",
  "CHIRURGIE THORACIQUE et VASCULAIRE" = "#9467bd"
)

ggplot(NCN_hosp, aes(x = annee, y = proportion, fill = specialite)) +
   geom_bar(stat = "identity") + 
   facet_wrap(~site) +
   scale_fill_manual(values = custom_colors) +
   theme(plot.title = element_text(hjust = 0.5, vjust = 1, size = 8),
         axis.text.x = element_text(angle = 90, hjust = 0.5, size = 5),
         axis.text.y = element_text(size = 5), 
         legend.text = element_text(size = 5),
         legend.key.height = unit(0.1, "cm"), 
         panel.grid.major = element_blank(), 
         panel.grid.minor = element_blank())+
   scale_y_continuous(labels = scales::percent)

3. 突出关键类别,弱化小占比类别

针对数据中占比极低的类别,用浅灰色弱化,重点突出主要类别:

# 给主要类别分配鲜艳颜色,小占比类别用灰色
highlight_colors <- c(
  "ANESTHESIE REANIMATION" = "#e0e0e0",
  "Autres" = "#e0e0e0",
  "CARDIO VASCULAIRE" = "#ff7f0e",
  "CHIRUGIE CARDIAQUE" = "#2ca02c",
  "CHIRURGIE GENERALE ET VISCERALE" = "#e0e0e0",
  "CHIRURGIE THORACIQUE et VASCULAIRE" = "#9467bd"
)

ggplot(NCN_hosp, aes(x = annee, y = proportion, fill = specialite)) +
   geom_bar(stat = "identity") + 
   facet_wrap(~site) +
   scale_fill_manual(values = highlight_colors) +
   theme(plot.title = element_text(hjust = 0.5, vjust = 1, size = 8),
         axis.text.x = element_text(angle = 90, hjust = 0.5, size = 5),
         axis.text.y = element_text(size = 5), 
         legend.text = element_text(size = 5),
         legend.key.height = unit(0.1, "cm"), 
         panel.grid.major = element_blank(), 
         panel.grid.minor = element_blank())+
   scale_y_continuous(labels = scales::percent)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:15:44