簡體   English   中英

如何使用Matplotlib制作每個單元都有特定像素大小的熱圖?

[英]How to make a heatmap using Matplotlib with a specific pixel size for each cell?

我可以輕松地使用

data = np.random.rand(4,4)
fig, ax = plt.subplots()
heatmap = ax.pcolor(data, cmap=plt.cm.Blues)
plt.show()

在此處輸入圖片說明

但是,如您所見,每個單元格都是矩形,我希望每個單元格都是正方形(32 x 32像素),生成512 x 512像素的圖像。

有沒有一種方法可以強制將圖(或每個單元格)設置為特定的像素大小?

編輯

  • 我的屏幕DPI是100
  • 我希望實際的熱圖是512 x 512,而不是整個數字

如果只需要包含與您的值相關聯的顏色並且沒有刻度線或標簽的圖像,我建議您使用PILPillow叉子中的 PIL.Image.fromarray 您需要平鋪數組,以便每個值重復32x32,然后可能使用float32 模式或int32模式創建圖像im = PIL.Image.fromarray(ndarray, mode='f')

PIL還允許您調整圖像的大小,因此您可以創建每個bin一個像素的圖像,然后在不按像素重新采樣的情況下調整大小im.resize((512,512),resample=0)

在這里,我引用下面的上一篇文章:

Matplotlib不能直接處理像素,而是可以處理物理尺寸和DPI。 如果要顯示具有特定像素大小的圖形,則需要知道顯示器的DPI。 例如,此鏈接將為您檢測到該鏈接。

如果您具有3841x7195像素的圖像,則監視器不太可能會那么大,因此您將無法顯示該尺寸的圖形(matplotlib要求該圖形適合屏幕尺寸,如果您要求一個尺寸太大會縮小到屏幕尺寸)。 讓我們想象一下,您僅需要一個800x800像素的圖像作為示例。 這是在監視器中顯示800x800像素圖像(my_dpi = 96)的方法:

plt.figure(figsize =(800 / my_dpi,800 / my_dpi),dpi = my_dpi)因此,您基本上只需將尺寸(以英寸為單位)除以DPI。

如果要保存特定大小的圖形,則是另一回事。 屏幕DPI不再那么重要了(除非您要求提供一個不適合屏幕的數字)。 使用相同的800x800像素圖形示例,我們可以使用savefig的dpi關鍵字將其保存為不同的分辨率。 要將其保存為與屏幕相同的分辨率,只需使用相同的dpi:

plt.savefig('my_fig.png',dpi = my_dpi)要將其保存為8000x8000像素圖像,請使用10倍大的dpi:

plt.savefig('my_fig.png',dpi = my_dpi * 10)請注意,並非所有后端都支持DPI的設置。 在這里,使用PNG后端,但是pdf和ps后端將以不同的方式實現大小。 同樣,更改DPI和大小也會影響諸如fontsize之類的內容。 較大的DPI將保持相同的字體和元素的相對大小,但是如果您希望較小的字體用於較大的圖形,則需要增加物理尺寸而不是DPI。

回到您的示例,如果要保存3841 x 7195像素的圖像,可以執行以下操作:

plt.figure(figsize =(3.841,7.195),dpi = 100)(您的代碼...)plt.savefig('myfig.png',dpi = 1000)請注意,我使用數字dpi來適應大多數情況屏幕,但以dpi = 1000保存以達到所需的分辨率。 在我的系統中,這會生成3840x7190像素的png -似乎保存的DPI總是比所選值小0.02像素/英寸,這將對大圖像尺寸產生(較小)影響。 這里對此進行更多討論。

以像素為單位指定並保存大小正確的圖形

希望能幫助到你!

暫無
暫無

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

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