searborn annotate覆盖以前

时间:2017-01-09 04:33:35

标签: python matplotlib seaborn

我正在尝试遍历大量的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)

此代码可以添加页面,但以前页面中的所有注释似乎都会在后面的所有页面中重叠(保留)。

enter image description here enter image description here enter image description here enter image description here enter image description here

1 个答案:

答案 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知道在每个循环中绘制并显式清除它。