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

