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

使用Pandas绘制带次坐标轴的列并将图表保存至单个PDF

自动化生成带次坐标轴的多图PDF解决方案

我太懂手动处理50列图表的崩溃感了!下面给你一套完整的自动化方案,能批量生成每个主列对应带次坐标轴的时间序列图,并且自动把所有图表保存到单个PDF文件里,完全不用手动重复操作。

核心思路

我们会用matplotlib的PdfPages来管理PDF输出,结合twinx()创建次坐标轴,再通过循环遍历DataFrame的列来批量生成图表。

完整代码示例

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages

# ----------------------
# 1. 准备你的数据(替换成自己的DataFrame)
# ----------------------
# 生成示例时间序列数据,你可以替换成自己的真实数据
dates = pd.date_range(start='2023-01-01', periods=100, freq='D')
df = pd.DataFrame({
    'Col A': pd.Series(range(100)) + pd.np.random.randn(100)*5,
    'Col B': pd.Series(range(100, 200)) + pd.np.random.randn(100)*8,
    'Col C': pd.Series(range(200, 300)) + pd.np.random.randn(100)*10,
    # ... 这里可以有50个类似的主列
    'Col Z': pd.Series(range(0, 1000, 10)) + pd.np.random.randn(100)*20  # 次坐标轴列
}, index=dates)

# ----------------------
# 2. 创建PDF文件对象
# ----------------------
pdf_filename = 'multi_timeseries_with_secondary_axis.pdf'
with PdfPages(pdf_filename) as pdf:
    # ----------------------
    # 3. 循环遍历所有主列(排除Col Z)
    # ----------------------
    for col in df.columns.drop('Col Z'):
        # 创建单个图表的画布和轴对象
        fig, ax1 = plt.subplots(figsize=(10, 6))
        
        # ----------------------
        # 绘制主坐标轴的时间序列
        # ----------------------
        color = 'tab:blue'
        ax1.set_xlabel('日期')
        ax1.set_ylabel(col, color=color)
        ax1.plot(df.index, df[col], color=color, linewidth=2)
        ax1.tick_params(axis='y', labelcolor=color)
        ax1.set_title(f'{col} 与 Col Z 时间序列对比')
        
        # ----------------------
        # 创建并绘制次坐标轴
        # ----------------------
        ax2 = ax1.twinx()  # 共享x轴,创建次y轴
        color = 'tab:red'
        ax2.set_ylabel('Col Z', color=color)
        ax2.plot(df.index, df['Col Z'], color=color, linestyle='--', linewidth=2)
        ax2.tick_params(axis='y', labelcolor=color)
        
        # ----------------------
        # 调整布局,避免标签重叠
        # ----------------------
        fig.tight_layout()
        
        # ----------------------
        # 将当前图表添加到PDF
        # ----------------------
        pdf.savefig(fig)
        plt.close(fig)  # 关闭画布,释放内存

print(f"所有图表已成功保存到 {pdf_filename}")

关键细节说明

  • 批量处理:通过for col in df.columns.drop('Col Z')循环,自动遍历所有需要绘图的主列,不管是50列还是更多都能搞定。
  • 次坐标轴创建:twinx()方法让我们在同一个图上创建共享x轴的次y轴,完美解决刻度不同的问题。
  • PDF管理:PdfPages上下文管理器会自动处理PDF的创建、添加页面和关闭,不用担心资源泄漏。
  • 布局优化:fig.tight_layout()自动调整图表元素位置,避免x轴日期标签和y轴标签重叠。
  • 内存优化:每次绘制完图表后用plt.close(fig)关闭画布,避免处理大量图表时内存溢出。

你只需要把示例中的数据替换成自己的DataFrame,修改Col Z为你实际的次坐标轴列名,运行代码就能得到包含所有图表的PDF啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:30:17