如何使用Matplotlib为每个单元格制作具有特定像素大小的热图?

时间:2017-02-16 13:55:32

标签: python matplotlib heatmap

我可以使用

轻松制作热图
data = np.random.rand(4,4)
fig, ax = plt.subplots()
heatmap = ax.pcolor(data, cmap=plt.cm.Blues)
plt.show()

enter image description here

然而,您可以看到每个单元格都是矩形的,并且我希望每个单元格都是正方形(32 x 32像素),生成512 x 512像素的图像。

有没有办法强制绘图(或每个单独的单元格)具有特定的像素大小?

编辑

  • 我的屏幕DPI是100
  • 我希望实际的热图为512 x 512和 整个数字

2 个答案:

答案 0 :(得分:1)

如果您只想要包含与您的值相关联的颜色且没有刻度线或标签的图片,我建议您使用PIL.Image.fromarray中的Pillow fork of PIL。您需要平铺数组,以便每个值重复32x32,然后使用float32 mode或int32模式创建您的图像。im = PIL.Image.fromarray(ndarray, mode='f')

PIL还允许您调整图像大小,因此您可以创建每个bin有一个像素的图像,然后resize,而不是每像素重新采样:im.resize((512,512),resample=0)

答案 1 :(得分:0)

我在下面的帖子中引用了以下帖子:

  

Matplotlib不直接使用像素,而是物理   尺寸和DPI。如果要显示具有特定像素的图形   大小,您需要知道您的显示器的DPI。例如这个链接   会为你检测出来。

     

如果您的图像为3841x7195像素,则不太可能   显示器将是那么大,所以你不能显示一个数字   那个大小(matplotlib要求图形适合屏幕,如果你   要求尺寸太大,它会缩小到屏幕尺寸)。让' S   想象你想要一个800x800像素的图像只是一个例子。这里' S   如何在我的显示器中显示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和大小也会影响像   字体大小。较大的DPI将保持相同的字体和相对大小   元素,但如果你想要更小的字体,你需要更大的数字   增加物理尺寸而不是DPI。

     

回到您的示例,如果您想使用3841 x保存图像   7195像素,您可以执行以下操作:

     

plt.figure(figsize =(3.841,7.195),dpi = 100)(你的代码......)   plt.savefig(' myfig.png',dpi = 1000)注意我使用的图dpi   100适合大多数屏幕,但用dpi = 1000保存来实现   要求的决议。在我的系统中,这会生成一个3840x7190的png   像素 - 似乎保存的DPI总是0.02像素/英寸   小于所选值,这将产生(小)效果   大图像尺寸。这里有更多的讨论。

Specifying and saving a figure with exact size in pixels

希望它有所帮助!