将分组函数的多个图形绘制并保存为PDF

2 投票
1 回答
2829 浏览
提问于 2025-04-17 23:22

我想创建一个包含12个图表的PDF文件,有两种选择:

  • 每页一个图表,
  • 每页四个图表。

使用 plt.savefig("months.pdf") 只会保存最后一个图表。

最小可重现示例:

import pandas as pd
index=pd.date_range('2011-1-1 00:00:00', '2011-12-31 23:50:00', freq='1h')
df=pd.DataFrame(np.random.randn(len(index),3).cumsum(axis=0),columns=['A','B','C'],index=index)

df2 = df.groupby(lambda x: x.month)
for key, group in df2:
    group.plot()

我还尝试过:

fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(15, 10))

group.plot 之后,但这样生成了四个空白的图表……

我找到一个关于 PdfPages 的例子,但我不知道怎么实现。

1 个回答

1

要在每一页保存一个图表,可以使用:

from matplotlib.backends.backend_pdf import PdfPages

# create df2
with PdfPages('foo.pdf') as pdf:
    for key, group in df2:
        fig = group.plot().get_figure()
        pdf.savefig(fig)

如果想在一页上放4个图表,你需要先创建一个包含4个图表的图形,然后再保存它:

import matplotlib.pyplot as plt
from itertools import islice, chain

def chunks(n, iterable):
    it = iter(iterable)
    while True:
       chunk = tuple(islice(it, n))
       if not chunk:
           return
       yield chunk

with PdfPages('foo.pdf') as pdf:
    for chunk in chunks(4, df2):
        fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(12, 4))
        axes = chain.from_iterable(axes)  # flatten 2d list of axes

        for (key, group), ax in zip(chunk, axes):
            group.plot(ax=ax)

        pdf.savefig(fig)

撰写回答