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

如何在R中正确创建带百分比刻度的双Y轴多折线图

ggplot主Y轴柱状图+次Y轴百分比折线图的正确实现

数据预处理

先对原始数据做聚合计算,得到每月的broj总和,以及每个obdukcija类别的月度占比:

library(dplyr)
library(lubridate)
library(ggplot2)

# 可复现示例数据集
data_df <- data.frame(
  datum = seq(as.Date("2023-01-01"), as.Date("2023-12-31"), by = "day"),
  obdukcija = sample(c("A", "B", "C"), 365, replace = TRUE),
  broj = sample(1:10, 365, replace = TRUE)
)

# 按月聚合计算总和与百分比
monthly_data <- data_df %>%
  mutate(month = floor_date(datum, "month")) %>%
  group_by(month, obdukcija) %>%
  summarise(total_broj = sum(broj), .groups = "drop") %>%
  group_by(month) %>%
  mutate(month_total = sum(total_broj),
         pct = (total_broj / month_total) * 100) %>%
  ungroup()

# 单独提取每月总broj(用于柱状图)
monthly_total <- monthly_data %>%
  group_by(month) %>%
  summarise(total = sum(total_broj), .groups = "drop")

核心绘图代码(解决次Y轴刻度问题)

关键是通过比例转换让折线图的百分比数据适配主Y轴的数值范围,再通过sec_axis转换回百分比刻度:

# 计算转换比例:主Y轴最大值 / 100(百分比的最大值)
scale_factor <- max(monthly_total$total) / 100

ggplot() +
  # 主Y轴:每月总broj柱状图
  geom_col(data = monthly_total, aes(x = month, y = total), fill = "steelblue", alpha = 0.7) +
  # 次Y轴:类别百分比折线图(先将百分比缩放至主Y轴范围)
  geom_line(data = monthly_data, aes(x = month, y = pct * scale_factor, color = obdukcija), linewidth = 1) +
  geom_point(data = monthly_data, aes(x = month, y = pct * scale_factor, color = obdukcija), size = 2) +
  # 主Y轴配置
  scale_y_continuous(
    name = "每月broj总和",
    breaks = seq(0, max(monthly_total$total), by = 50), # 可根据实际数据调整间隔
    expand = c(0, 0)
  ) +
  # 次Y轴配置:将缩放后的数值转换回百分比
  scale_y_continuous(
    sec.axis = sec_axis(
      trans = ~ . / scale_factor,
      name = "各obdukcija类别占比",
      breaks = seq(0, 100, by = 20),
      labels = function(x) paste0(x, "%")
    )
  ) +
  # X轴日期格式设置
  scale_x_date(date_labels = "%Y-%m", date_breaks = "1 month") +
  scale_color_brewer(palette = "Set1") +
  labs(x = "月份", title = "月度broj总和与类别占比趋势") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

关键说明

  • 比例转换是核心:ggplot的次Y轴只是视觉刻度映射,实际绘图数据必须在同一坐标系范围内。如果直接用百分比(0-100)和主Y轴的总和(比如几百上千)绘制,折线会被压缩到图表底部,完全无法展示。
  • 可灵活调整参数:根据实际数据修改主、次Y轴的breaks间隔,或调整scale_factor的计算逻辑,确保刻度贴合数据分布。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 15:17:32