Python中如何将循环生成的多张绘图分别保存为PDF独立页面
问题根因
你当前代码的问题出在两个地方:
with PdfPages('90thPercentile.pdf') as pdf语句被放在了循环内部,每次循环都会重新创建同名PDF文件覆盖旧文件,所以最终只会保留最后一次循环的输出结果plt.figure没有加括号,没有实际实例化新的画布,可能导致绘图内容重叠
修改方案
只需要调整两个位置即可:
- 将PDF文件的上下文管理器移到循环最外层,保证所有绘图都写入同一个PDF文件
- 将
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
相关产品推荐
相关产品推荐

