使用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
相关产品推荐
相关产品推荐

