matplotlib savefig()大小控件

时间:2012-10-25 16:25:49

标签: python matplotlib pandas

我编写了一个函数,它从Pandas生成了一个数据帧并生成了热图:

def drawHeatMap(df, city, province, collector, classtype, color, titleposy):
    try:
        thePlot = pl.matshow(df.values, cmap='PuBuGn')
        pl.colorbar(thePlot, orientation='vertical')
        aTitle = (classtype + ' Composition Changes Over Time in ' + city + 
                ', ' + province + '\n' + collector + ' collector. ' + 'rs100')
        pl.title(aTitle, x=0.5, y=titleposy, style='oblique', weight='bold')
        pl.xlabel('Collection Time')
        pl.xticks(range(len(df.columns)), df.columns, rotation=90)
        pl.yticks(range(len(df.index)), df.index)
        fileName = (classtype + '-' + city + '-' 
                + province + '-' + collector + '.png')
        pl.savefig(fileName)
    except ZeroDivisionError:
        errorMessage = ('No Data Avaiable for ' + city + ', ' + province + 
                ' with ' + collector + ' collector.')
        print errorMessage

我遇到的问题是,savefig()会在修剪轴和图形的情况下保存数字。我必须使用show(),最大化图形并自己使用GUI按钮手动保存图形。

如何修复我的功能以便savefig()能够正确保存图表?我试图在pl.savefig()之前设置这样的一行来控制我的身材:

       pl.figure(figsize=....) 

但我最终会产生一些空图。编写matplotlib函数的正确方法是什么,让我可以完全控制保存数字?

更新了问题数据的示例: enter image description here

6 个答案:

答案 0 :(得分:8)

我在plt.tight_layout()之前添加了savefig(),它解决了我的修剪问题。也许它也会帮助你。

编辑:我还在开头rcParams['figure.figsize'] = 40, 12设置了数字大小(你可以设置你自己的宽度和高度)

答案 1 :(得分:7)

documentation,您可以添加dpi参数来设置分辨率。

savefig('foo.png', dpi=199)

答案 2 :(得分:4)

<强>短
您只需要在之前拨打pl.figure(figsize=...) ,然后拨打pl.colorbar(以及所有其他内容)

<强>解释
pl.figure创建一个 new 数字(具有指定大小),所有pl.*方法将在其中执行以下操作。
因此pl.savefig只保存最后创建的数字,如果您在前一行中创建了一个新数字,则该数字为空。

答案 3 :(得分:1)

命令pl.figure()创建了一个新的matplotlib图。图形大小在实例化时设置。你确实想要设置数字大小,但你已经有了数字。所以你走在正确的轨道上,但试试这个:

def drawHeatMap(df, city, province, collector, classtype, color, titleposy):
    try:
        fig = pl.figure(figsize=(....))
        ax = fig.add_subplot(111)
        ax.matshow(df.values, cmap='PuBuGn')
        pl.colorbar()
        aTitle = classtype + ' Composition Changes Over Time in ' + city + ', ' + province + '\n' + collector + ' collector. ' + 'rs100'
        ax.set_title(aTitle, x=0.5, y=titleposy, style='oblique', weight='bold')
        ax.set_xlabel('Collection Time')
        ax.set_xticks(range(len(df.columns)), df.columns, rotation=90)
        ax.set_yticks(range(len(df.index)), df.index)
        fileName = classtype + '-' + city + '-' + province + '-' + collector + '.png'
        fig.savefig(fileName)
    except ZeroDivisionError:
        errorMessage = 'No Data Available for ' + city + ', ' + province + ' with ' + collector + ' collector.'
        print errorMessage

答案 4 :(得分:0)

在致电pl.savefig(fileName)之前 做plt.tight_layout()

答案 5 :(得分:0)

以所需尺寸保存图形

figure = plt.gcf()
figure.set_size_inches(width/100, height/100)
plt.axis('off')
plt.plot(x, y, color='black', linewidth=1)
plt.gca().set_position([0, 0, 1, 1])  
plt.savefig("image.png", dpi=100)