ggplot2如何调整y轴科学计数法并绘制分组占比柱状图?
R堆叠柱状图优化方案
核心用到的函数
dplyr::group_by()、dplyr::mutate():按性别维度分组,计算每组总观测数、state=1类别的占比指标scales::label_number()、scales::percent():格式化坐标轴刻度与占比文本,替换默认科学计数法为易读格式ggplot2::scale_y_continuous():自定义y轴的刻度规则、显示标签ggplot2::geom_text():在图表对应位置添加占比标注
完整实现代码
# 加载依赖包 library(ggplot2) library(tidyr) library(dplyr) library(scales) # 构建原始数据集 df <- data.frame(state = c('0','1'), male = c(26287942,9134784), female = c(16234000,4406645)) # 数据格式转换+指标计算 df_long <- df |> pivot_longer(cols = c("female","male"), names_to = "sex", values_to = "observations") |> group_by(sex) |> mutate( total_obs = sum(observations), # 计算每个性别分组的总观测数 state1_pct = observations[state == "1"] / total_obs, # 计算state=1观测数的占比 # 计算占比标签的垂直位置,放在state=1柱块的中心 label_pos = observations[state == "0"] + observations[state == "1"]/2 ) |> ungroup() # 绘制优化后的图表 ggplot(data = df_long, aes(x = sex, y = observations, fill = state)) + geom_col(width = 0.6) + # 优化y轴刻度:转百万单位显示,完全移除科学计数法 scale_y_continuous( labels = label_number(scale = 1e-6, suffix = "M"), name = "观测数(单位:百万)" ) + # 添加占比标注 geom_text( data = ~.x |> filter(state == "1"), aes(y = label_pos, label = percent(state1_pct, accuracy = 0.1)), color = "white", size = 4 ) + # 调整图例与主题样式 theme( legend.position = c(0.1,0.9), legend.background = element_rect(fill='lightgrey'), panel.grid.minor = element_blank() ) + # 可选:自定义填充色匹配参考样式 scale_fill_manual(values = c("#8da0cb", "#fc8d62"), labels = c("state=0", "state=1"))
自定义调整说明
- 如果需要将占比制作成独立的次坐标轴图表,可以在
scale_y_continuous()中添加sec.axis = sec_axis(~./max(.*max_pct), name = "state=1占比")参数定义次轴范围,再新增geom_line()或geom_col()图层映射占比字段到次轴即可 - 可以修改
label_number()里的scale参数调整单位:比如要显示“千万”单位就把scale设为1e-7,suffix设为“千万” - 占比标注的位置、大小、颜色都可以在
geom_text()里修改对应参数调整
内容的提问来源于stack exchange,提问作者Patrick Star
相关产品推荐
相关产品推荐

