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

Python中如何将循环生成的多张绘图分别保存为PDF独立页面

问题根因

你当前代码的问题出在两个地方:

  • with PdfPages('90thPercentile.pdf') as pdf 语句被放在了循环内部,每次循环都会重新创建同名PDF文件覆盖旧文件,所以最终只会保留最后一次循环的输出结果
  • plt.figure 没有加括号,没有实际实例化新的画布,可能导致绘图内容重叠
修改方案

只需要调整两个位置即可:

  1. 将PDF文件的上下文管理器移到循环最外层,保证所有绘图都写入同一个PDF文件
  2. 将plt.figure改为plt.figure(),每次循环都创建新的空白画布
修改后完整代码示例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
import copy

# 将PDF上下文管理器移到循环最外层
with PdfPages('90thPercentile.pdf') as pdf:
    plt.rcParams['text.usetex'] = False
    # Huge Loop
    for j in TempDict:
        #Make Baseline
        df=TempDict[j]
        df=pd.to_numeric(df.tmax, errors='coerce')
        mask = (df.index >= '1900-01-01') & (df.index <= '1940-12-31')
        Baseline=df.loc[mask]
        Tmax=Baseline.astype(np.float64)
        Index=Baseline.index
        DailyBase=pd.DataFrame(data={'date':Index,'tmax':Tmax})
        #pivot dataframe
        DailyBase['year']=DailyBase.date.dt.year
        DailyBase['day']=DailyBase.date.dt.strftime('%m-%d')
        BaseResult=DailyBase[DailyBase.day!='02-29'].pivot(index='year',columns='day',values='tmax')
        #Calculate Percentiles
        BaseResult.index=list(range(1,42))
        BaseResult.insert(0,'12-31_',BaseResult['12-31'])
        BaseResult.insert(0,'12-30_',BaseResult['12-30'])
        BaseResult['01-01_'] = BaseResult['01-01']
        BaseResult['01-02_'] = BaseResult['01-02']
        p90_todict = {}
        for i in range(len(BaseResult.columns)-4):
            index = i+2
            p90_todict[BaseResult.columns[index]] = np.quantile(BaseResult.iloc[:,index-2:index+3].dropna(),.9)
        #Make POR dataframe
        #pull tmax and dates from original ACIS data
        FullTmax=df.astype(np.float64)
        FullIndex=df.index
        #create and rotate data frame
        DailyPOR=pd.DataFrame(data={'date':FullIndex,'tmax':FullTmax})
        DailyPOR['year']=DailyPOR.date.dt.year
        DailyPOR['day']=DailyPOR.date.dt.strftime('%m-%d')
        PORResult=DailyPOR[DailyPOR.day!='02-29'].pivot(index='year',columns='day',values='tmax')
        #eliminate leap years from POR daily data
        noleap_DailyPOR = copy.copy(DailyPOR[DailyPOR.day != '02-29'])
        noleap_DailyPOR.index = noleap_DailyPOR.date
        #Use only winter months
        only_winter = noleap_DailyPOR[(noleap_DailyPOR.index.month >= 12) | (noleap_DailyPOR.index.month <= 2)]
        #set results to 0 for counts
        p90results = pd.DataFrame(index = only_winter.date)
        p90results['above90'] = 0
        #Compare POR and percentiles
        for index, row in only_winter.iterrows():
            if row.tmax > p90_todict[row.day]:
                p90results.loc[row.date,'above90'] = 1
        #Sum annual counts above percentiles
        p90_annual=p90results.groupby(p90results.index.year).sum()
        # 新增括号创建新画布
        plt.figure()
        plt.plot(p90_annual)
        plt.title(j)
        plt.ylabel('Days Above 90th Percentile')
        pdf.savefig()
        plt.close()

注:已将原本写在循环内的import copy移到代码顶部,符合Python导入规范,不影响原有逻辑运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:24:02