38

我编写了一个函数,该函数采用从 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 函数的正确方法是什么,让我可以完全控制保存图形?

更新为问题图示例: 在此处输入图像描述

4

7 回答 7

28

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

编辑:我还在开始时设置了图形大小rcParams['figure.figsize'] = 40, 12(您可以设置自己的宽度和高度)

于 2014-06-25T04:02:17.233 回答
25

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

savefig('foo.png', dpi=199)
于 2015-02-03T07:25:44.697 回答
10

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

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

于 2012-10-25T17:05:20.803 回答
5

在调用pl.savefig(fileName) do之前plt.tight_layout()

于 2019-09-26T10:31:47.500 回答
2

该命令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
于 2012-10-25T17:04:23.763 回答
1

您可以使用 dpi 参数在 savefig 方法中设置分辨率(以每英寸点数为单位)。所以你可以控制图形大小。例如,如果您使用以下代码:

import pandas as pd
import matplotlib.pyplot as plt


df = pd.DataFrame({ 
    'ser1' : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] , 
    'ser2' : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
    })

df.plot()
plt.savefig("100.png" , dpi = 100)
plt.savefig("300.png" , dpi = 300)

100.png 将是:

100.png

300.png 将是:

300.png

于 2022-02-05T19:03:31.217 回答
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)
于 2021-07-07T19:59:26.387 回答