不缩放显示图像

ste*_*wpf 11 python matplotlib

给定 500x500 像素的图像,我想在屏幕上以 1:1 的比例显示该图像。另外我想要一个 x 和 y 轴。

  • plt.imshow() 自动将轴添加到我的图像并将图像在窗口中居中,但图像被缩放并且在我的屏幕上未显示为 500x500 像素。
  • fig.figimage()在我的屏幕上以 1:1 显示图像,但不添加轴并在窗口的左下角显示图像。特别是最大化窗口/调整窗口大小不会改变图像的大小。

现在我需要的是两者的结合 - 像 1:1 一样显示图像fig.figshow,添加轴,像这样plt.imshow()添加和显示图像居中plt.imshow()

我怎样才能做到这一点?或者换句话说:如何告诉plt.imshow()显示像未缩放的图像fig.figimage()

演示问题的示例代码:

import matplotlib.pyplot as plt
import numpy as np

width=500;
height=500;

# using plt.imshow()
dummyImage = np.zeros((width, height))
plt.imshow(dummyImage)
plt.show()

# using fig.figimage()
fig = plt.figure(figsize=(width, height))
fig.figimage(dummyImage)
plt.show()
Run Code Online (Sandbox Code Playgroud)

结果:

使用plt.imshow():不完全是 500x500 像素,实际大小取决于窗口的大小。 在此处输入图片说明

使用fig.figimage():正好 500x500 像素,与窗口大小无关

在此处输入图片说明

Imp*_*est 4

您需要自己做一些计算。假设您希望所有边距均为 50 像素,并且 dpi 为 100,则可以将图形尺寸计算为figsize=((width+2*margin)/dpi, (height+2*margin)/dpi)英寸。然后,您需要计算边框,例如左边框将是边距除以 dpi 除以图形宽度。您可以将计算出的图形大小(figsize的参数plt.figure())和边框(使用subplots_adjust)设置为您的图形。

import matplotlib.pyplot as plt
import numpy as np

width=500 # pixels
height=150
margin=50 # pixels
dpi=100. # dots per inch

figsize=((width+2*margin)/dpi, (height+2*margin)/dpi) # inches
left = margin/dpi/figsize[0] #axes ratio
bottom = margin/dpi/figsize[1]

fig = plt.figure(figsize=figsize, dpi=dpi)
fig.subplots_adjust(left=left, bottom=bottom, right=1.-left, top=1.-bottom)

dummyImage = np.zeros((height, width))
plt.imshow(dummyImage)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

width请注意,要获得尺寸为 width和 height的图像height,您需要一个数组np.zeros((height, width)),而不是相反的数组。

为了确保图形保持其原始大小,可以添加以下代码,该代码在每次尝试更改图形大小时将图形大小调整回其原始大小:

def update(event=None):
    fig.set_size_inches(figsize)

update()
ci = fig.canvas.mpl_connect("resize_event", update)
plt.show()
Run Code Online (Sandbox Code Playgroud)