如何修改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
相关产品推荐
相关产品推荐

