簡體   English   中英

matplotlib savefig() 大小控制

[英]matplotlib savefig() size control

我編寫了一個函數,該函數采用從 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 函數的正確方法是什么,讓我可以完全控制保存圖形?

更新為問題圖示例:在此處輸入圖像描述

我在plt.tight_layout()之前添加了 plt.tight_layout savefig() ,它解決了我遇到的修剪問題。 也許它也會對你有所幫助。

編輯:我還在rcParams['figure.figsize'] = 40, 12設置了圖形大小(您可以設置自己的寬度和高度)

文檔中,您可以添加一個dpi參數來設置分辨率。

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

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

解釋:
pl.figure創建一個圖形(具有給定大小),所有pl.*方法都將在其上執行以下操作。
所以pl.savefig只是保存最后創建的圖形,如果您在前面的行中創建了一個新圖形,則該圖形為空。

在調用pl.savefig(fileName)之前做plt.tight_layout()

命令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

您可以使用 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

保存所需尺寸的圖形

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)

您需要一起使用set_size_inches函數和savefig中的dpi參數來定義保存的圖形大小(以像素為單位)。

  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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM