Python循环中如何将DataFrame散点图批量保存至单个PDF文件
问题:将多个DataFrame散点图保存到单个PDF文件中
你尝试用以下代码保存散点图到PDF时出现错误:
pdf = matplotlib.backends.backend_pdf.PdfPages("./output.pdf") for df in list_degs_dfs: dfplt = df.plot.scatter("DEratio", "MI_scaled") pdf.savefig(dfplt) pdf.close()
错误信息:
ValueError: No figure AxesSubplot(0.125,0.11;0.775x0.77)
后续尝试转换对象时又触发新错误:
import matplotlib.pyplot as plt pdf = matplotlib.backends.backend_pdf.PdfPages("./output.pdf") for df in list_degs_dfs: dfplt = df.plot.scatter("DEratio", "MI_scaled") dfplt = plt.figure(dfplt) pdf.savefig(dfplt.Figure) pdf.close()
错误信息:
TypeError: int() argument must be a string, a bytes-like object or a number, not 'AxesSubplot'
核心原因
df.plot.scatter()返回的是AxesSubplot对象(坐标轴实例),而PdfPages.savefig()需要传入的是Figure对象(画布实例),直接传递Axes会触发第一个错误;plt.figure()不接受Axes对象作为参数,因此触发第二个错误。
正确解决方案
方案1:从Axes获取对应Figure
通过Axes对象的get_figure()方法提取所属的Figure,再传入savefig():
import matplotlib.pyplot as plt from matplotlib.backends.backend_pdf import PdfPages pdf = PdfPages("./output.pdf") for df in list_degs_dfs: # 生成散点图,得到Axes实例 ax = df.plot.scatter("DEratio", "MI_scaled") # 从Axes获取关联的Figure fig = ax.get_figure() # 保存当前Figure到PDF pdf.savefig(fig) # 关闭Figure释放内存 plt.close(fig) pdf.close()
方案2:手动创建Figure和Axes
提前创建Figure和Axes,指定pandas绘图时使用该Axes,直接操作Figure:
import matplotlib.pyplot as plt from matplotlib.backends.backend_pdf import PdfPages pdf = PdfPages("./output.pdf") for df in list_degs_dfs: # 手动创建画布和坐标轴 fig, ax = plt.subplots() # 强制pandas在指定Axes上绘图 df.plot.scatter("DEratio", "MI_scaled", ax=ax) # 保存画布到PDF pdf.savefig(fig) plt.close(fig) pdf.close()
内容的提问来源于stack exchange,提问作者Yulia Kentieva
相关产品推荐
相关产品推荐

