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

如何在R语言(ggplot2)中同时创建柱状图与折线图

组合柱状图与折线图(双Y轴)优化方案

我看了你这段用于分析访问频次和平均访问时长的双Y轴图表代码,整体思路没问题,不过可以做一些优化让图表更清晰、代码更简洁易维护。下面是调整后的完整代码和详细说明:

数据准备

首先确认你的数据框是正确的:

library(ggplot2)
# 定义数据框
df <- data.frame(
  visit_sequence_number = c(1:5),
  visit_frequency = c(697754, 416613, 263433, 178823, 128599),
  visit_duration_avg = c(133, 121, 121, 122, 124)
)

优化后的绘图代码

# 提前计算缩放因子,避免重复计算
scale_factor <- max(df$visit_frequency)

ggplot(df, aes(x = visit_sequence_number)) +
  # 主Y轴:柱状图展示访问频次
  geom_bar(aes(y = visit_frequency), 
           stat = "identity", 
           fill = "tan1", 
           colour = "sienna3") +
  # 次Y轴:折线图展示平均访问时长(已缩放匹配主Y轴范围)
  geom_line(aes(y = visit_duration_avg * scale_factor), 
            color = "darkblue", 
            size = 1.2) +
  geom_point(aes(y = visit_duration_avg * scale_factor), 
             color = "darkblue", 
             size = 2) +
  # 柱状图上的数值标签
  geom_text(aes(y = visit_frequency, label = visit_frequency),
            vjust = 1.5, 
            color = "black",
            size = 3.5) +
  # 折线图上的数值标签
  geom_text(aes(y = visit_duration_avg * scale_factor, label = visit_duration_avg),
            vjust = -0.8, 
            color = "darkblue",
            size = 3.5) +
  # 设置双Y轴
  scale_y_continuous(
    name = "Visit Frequency",  # 主Y轴标签
    sec.axis = sec_axis(~./scale_factor, name = "Average Visit Duration (minutes)")  # 次Y轴标签
  ) +
  # 设置X轴标签和图表标题
  scale_x_continuous(name = "Visit Sequence Number", breaks = 1:5) +
  labs(title = "Visit Frequency vs Average Duration by Visit Sequence") +
  # 调整主题样式,让图表更美观
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
    axis.title.y = element_text(color = "sienna3", size = 12),
    axis.title.y.right = element_text(color = "darkblue", size = 12),
    axis.text = element_text(size = 10)
  )

关键优化点说明

  • 提取缩放因子:把max(df$visit_frequency)存为scale_factor,避免代码中重复计算,同时让后续调整更方便
  • 明确轴标签:给主、次Y轴都添加了清晰的标签,读者一眼就能理解每个轴的含义
  • 强化折线样式:给折线增加了宽度和配套的点标记,让折线图在柱状图之上更突出
  • 优化文本位置:调整了标签的垂直偏移(vjust),避免标签和图表元素重叠
  • 美化主题:使用theme_minimal()并自定义标题、轴标签的样式,提升整体视觉效果

这样调整后的图表不仅满足你的需求,可读性和美观度都有明显提升,代码也更易于维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:33:27