我正在尝试遍历大量的pandas数据帧并将图表附加到pdf。这是示例代码:
import random
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from matplotlib.backends import backend_pdf
df = pd.DataFrame({'a':[a + + random.random() for a in range(12)] ,
'b':[ b + random.random() for b in range(12,24)]})
print(df)
chunk_size = 3 # number of rows in heatmap
n_chunks = len(df)//chunk_size # number of pages in heatmap pdf
with backend_pdf.PdfPages('chart.pdf') as pdf_pages:
for e,(k,g) in enumerate(df.groupby(np.arange(len(df))//chunk_size)):
#print(k,g.shape)
snsplot = sns.heatmap(g, annot=True, cbar=False, linewidths=.5) #fmt="d",cmap="YlGnBu",
pdf_pages.savefig(snsplot.figure)
此代码可以添加页面,但以前页面中的所有注释似乎都会在后面的所有页面中重叠(保留)。
答案 0 :(得分:3)
每次拨打sns.heatmap
时,都会使用plt.gca()
,因此您的所有绘图都会转到相同的Axes
对象(每个循环可能会像以前的所有艺术家一样变慢被渲染,但被最新的一个遮挡了。
我建议像
fig, ax = plt.subplots()
with backend_pdf.PdfPages('chart.pdf') as pdf_pages:
for e,(k,g) in enumerate(df.groupby(np.arange(len(df))//chunk_size)):
#print(k,g.shape)
ax.cla()
snsplot = sns.heatmap(g, annot=True, cbar=False, linewidths=.5, ax=ax)
pdf_pages.savefig(snsplot.figure)
在Axes
对象中传递,因此seaborn知道在每个循环中绘制并显式清除它。