Matplotlib:imshow 图像的坐标约定与 plot 不兼容

6
我有一个关于使用matplotlib.pyplot在图像上绘制点的问题。
众所周知,imshow的约定是原点位于左上角,x轴向下,y轴向右。但是当我使用plt.plot()绘制一些点时,坐标轴似乎变为了x轴向右,y轴向下。
这里有一个例子。窗口中光标的位置显示为x=434,y=162。然而,根据imshow的约定,它应该是x=162,y=434。
有没有办法让plot函数遵循imshow的约定,或者让imshow将原点放在左下角以遵循plot的约定?非常感谢!

3
请记住,数组索引是 (行,列) -> (y,x),但按照数学惯例/绘图,我们指定点为 (x,y) - tacaswell
1个回答

9

plt.imshow有一个名为origin的选项,它可以改变原点的位置。从文档中可以看到:

origin:[‘upper’ | ‘lower’],可选,默认值:None

将数组的[0,0]索引放置在坐标轴的左上角或左下角。如果为None,则默认使用rc image.origin。

根据您的描述,似乎您想设置origin = 'lower'

要交换x和y轴,您还需要转置图像数组。考虑以下示例:

import matplotlib.pyplot as plt
import matplotlib.cbook as cbook

image_file = cbook.get_sample_data('ada.png')
img = plt.imread(image_file)

fig,((ax1,ax2),(ax3,ax4)) = plt.subplots(2,2)

ax1.imshow(img, origin='upper')
ax2.imshow(img, origin='lower')
ax3.imshow(img.transpose(1,0,2), origin='upper')
ax4.imshow(img.transpose(1,0,2), origin='lower')

ax3.set_xlabel('upper')
ax4.set_xlabel('lower')

ax1.set_ylabel('Not transposed')
ax3.set_ylabel('Transposed')

plt.show()

enter image description here

我认为您想要右下方的坐标轴,因此请使用ax4.imshow(img.transpose(1,0,2), origin='lower')。请注意,为了转置图像数组,我们必须将RGBA通道保留为最后一个轴,因此使用(1,0,2)来转置第一和第二个轴。

谢谢你的回答。尝试了这个选项后,它只是翻转了y轴,所以现在指向上方。但是x轴仍然是水平的,没有指向下方。 - Vinwim
那么,我想你想要转置你的数据数组是吗? - tmdavison
是的,最后一个是我想要的。谢谢! - Vinwim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接