R ggplot堆叠条形图保留堆叠绝对值y轴转百分比显示问题
百分百堆叠条形图Y轴转百分比解决方案
核心修改点
你只需要在原有代码基础上做少量调整即可满足需求,无需额外重构占比数据框,可根据实际需求选择以下两种方案:
方案1:实现真100%堆叠(条形总高度统一为100%,推荐)
- 给
geom_bar()添加position = "fill"参数,实现100%堆叠效果 - 新增
scale_y_continuous()配置,将y轴比例值转换为百分比刻度显示 - 堆叠内部的绝对计数文本不需要调整,原有
stat_count逻辑可直接保留
完整修改后代码:
event_labels <- c("T0\nBaseline", "T1\nDay 7", "T2\nWeek 6", "T3\nWeek 12", "T4\n6 Months\nFollow-Up") names(event_labels) <- c("t0", "t1", "t2", "t3", "t4") rem_eular_response <- rem_eular_data %>% ggplot(aes(x=gruppe, fill=factor(number_ordered))) + # 新增position参数实现100%堆叠 geom_bar(position = "fill") + stat_count(geom = "text", aes(label = (..count..)), position = position_stack(vjust = 0.5), size = 4) + facet_wrap(~event, scales="free", ncol=3, labeller = labeller(event = event_labels)) + labs(title ="", fill="") + ylab("Patients achieving response [%]") + xlab("") + theme_bw()+ theme(strip.background=element_rect(fill="lightgrey", color="transparent"), panel.border = element_blank(), axis.line = element_line(color="black", size=0.2), strip.text = element_text(face="bold"), legend.position = "bottom", legend.title=element_text())+ scale_x_discrete(labels=c('DGE', 'Fasting'))+ # 新增y轴百分比刻度配置,不需要scales包可以替换为自定义函数 scale_y_continuous(labels = scales::percent_format(accuracy = 1), breaks = seq(0,1,0.25)) + scale_fill_brewer(palette = 'Accent', na.value = "grey70", labels=c('Good Responder', 'Moderate Responder', 'Non-Responder', 'Missing'))
若不想引入scales包,可将scale_y_continuous替换为以下写法:
scale_y_continuous(labels = function(x) paste0(x*100, "%"), breaks = seq(0,1,0.25))
方案2:仅修改y轴刻度(保持原条形高度不变,仅数值转换)
如果不需要条形总高度统一为100%,只想按照你提到的「刻度值乘4转百分比」的逻辑修改,不需要调整geom_bar,直接新增以下配置即可:
scale_y_continuous(labels = function(x) paste0(x*4, "%"), breaks = seq(0,25,5))
内容的提问来源于stack exchange,提问作者Anika
相关产品推荐
相关产品推荐

