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

如何在R语言时间轴上绘制双Y轴双变量月度统计图

Markdown格式排版规则
  • 标题层级:使用井号(#)标识不同级别的标题
  • 列表内容:使用短横线(-)作为条目开头
  • 文本强调:将需要突出的内容用星号(*)包裹
  • 代码/命令:将需要标识为代码的内容用反引号(`)包裹
  • 引用内容:使用大于号(>)作为行首标识引用文本
  • 链接格式:将链接显示文本放在方括号[]内,紧随其后在圆括号()中放置目标地址
  • 图片格式:将图片替代说明文本放在方括号[]内,紧随其后在圆括号()中放置图片资源地址
双Y轴月度统计图表实现方案

实现逻辑

  • 解析原始Date字段为标准时间格式,保证X轴月份时间轴连贯无顺序错乱
  • 基础画布配置左轴,承载Events(总事件数)数值,用柱状图匹配数据量级
  • 调用ax.twinx()创建共享X轴的右侧Y轴,承载Percentage(事件占比)数值,用折线图匹配参考图的呈现形式
  • 分别配置双轴的标签、刻度样式,调整X轴标签角度避免重叠,合并双轴图例后自动适配画布布局

可直接运行的代码

import pandas as pd
import matplotlib.pyplot as plt

# 加载原始数据
df = pd.DataFrame({
    'Date': ['01/2020', '02/2020', '03/2020', '04/2020', '05/2020', '06/2020',
            '07/2020', '08/2020', '09/2020', '10/2020', '11/2020', '12/2020'],
    'Events': [200, 190, 8000, 12000, 15000, 13000, 10000, 11000, 18000, 15000, 16000, 18000],
    'Percentage': [5.5, 6.3, 28.3, 30.1, 27.6, 16.7, 12.0, 17.0, 20.1, 22.2, 25.1, 29.0]
})
# 转换日期字段为时间类型
df['Date'] = pd.to_datetime(df['Date'], format='%m/%Y')

# 初始化画布与左轴
fig, ax1 = plt.subplots(figsize=(10, 6))
# 左轴绘制事件数柱状图
ax1.bar(df['Date'], df['Events'], color='#4271b3', alpha=0.7, label='总事件数')
ax1.set_xlabel('月份')
ax1.set_ylabel('总事件数', color='#4271b3')
ax1.tick_params(axis='y', labelcolor='#4271b3')

# 创建共享X轴的右轴
ax2 = ax1.twinx()
# 右轴绘制占比折线图
ax2.plot(df['Date'], df['Percentage'], color='#f28e2b', marker='o', linewidth=2, label='事件占比')
ax2.set_ylabel('事件占比(%)', color='#f28e2b')
ax2.tick_params(axis='y', labelcolor='#f28e2b')

# 调整X轴标签角度避免重叠
plt.xticks(rotation=45)
# 合并双轴图例
h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
ax1.legend(h1 + h2, l1 + l2, loc='upper left')
# 适配画布布局防止标签裁切
fig.tight_layout()
plt.show()

效果说明

  • 生成的图表自动匹配数据范围:总事件数最高值18000对应左轴数值上限,事件占比最高值30.1%对应右轴数值上限,和参考图的刻度分布逻辑一致
  • 两个维度的序列采用差异化色彩和图形样式,避免视觉混淆

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 10:15:04