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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:03:34