matplotlib savefig()大小控件

Won*_*eve 19 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
Run Code Online (Sandbox Code Playgroud)

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

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

       pl.figure(figsize=....) 
Run Code Online (Sandbox Code Playgroud)

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

更新了问题图的示例: 在此输入图像描述

WHZ*_*HZW 12

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

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


小智 10

简短:
您只需要在调用(以及所有其他内容)pl.figure(figsize=...) 之前调用pl.colorbar

说明:
pl.figure创建一个新的图形(具有给定的大小),所有pl.*方法都将在下面起作用。
因此,pl.savefig只需保存最后创建的图形,如果您在前一行创建了一个新图形,则该图形为空。


Xia*_*iao 10

文档中,您可以添加dpi参数来设置分辨率.

savefig('foo.png', dpi=199)
Run Code Online (Sandbox Code Playgroud)


Hon*_*ang 10

您需要一起使用该set_size_inches函数和dpi参数savefig来定义保存的图形大小(以像素为单位)。

  1. 通过 设定图形的宽度和高度(以英寸为单位)plt.gcf().set_size_inches(10, 5)
  2. dpi保存图形时定义plt.savefig('filename.png', dpi=100)dpi意思是“每英寸点数”。
  3. 保存的图形宽度将为 1000(10x100),高度将为 500(5x100)。保存的图形大小将为 1000x500(像素)。

示例代码片段:

import matplotlib.pyplot as plt


def fig_size():
    plt.plot(range(0, 10), range(0, 10))
    plt.gcf().set_size_inches(10, 5)
    plt.savefig('charts/fig_size.png', dpi=200)
Run Code Online (Sandbox Code Playgroud)


小智 6

在打电话之前pl.savefig(fileName)plt.tight_layout()


Mr.*_*uig 4

该命令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
Run Code Online (Sandbox Code Playgroud)