Matplotlib:如何使imshow从其他numpy数组中读取x,y坐标?

FaC*_*fee 7 python numpy matplotlib imshow

当你想要绘制一个numpy数组时imshow,这就是你通常做的事情:

import numpy as np
import matplotlib.pyplot as plt

A=np.array([[3,2,5],[8,1,2],[6,6,7],[3,5,1]]) #The array to plot

im=plt.imshow(A,origin="upper",interpolation="nearest",cmap=plt.cm.gray_r)
plt.colorbar(im)
Run Code Online (Sandbox Code Playgroud)

这给了我们这个简单的图像: 在此输入图像描述

在该图像中,简单地从阵列中每个值的位置提取xy坐标.现在,假设这A是一个引用某些特定坐标的值数组:

real_x=np.array([[15,16,17],[15,16,17],[15,16,17],[15,16,17]])
real_y=np.array([[20,21,22,23],[20,21,22,23],[20,21,22,23]])
Run Code Online (Sandbox Code Playgroud)

这些价值构成了我的理由.有没有办法强制imshow在A对应的坐标对(real_x,real_y)中分配每个值?

PS:我不是在寻找向基于数组的x和y添加或减去某些东西以使它们与real_xreal_y匹配,而是用于从real_xreal_y数组中读取这些值的东西.然后,预期结果是具有x轴上的real_x值和y轴上的real_y值的图像.

Imp*_*est 11

设定范围

假设你有

real_x=np.array([15,16,17])
real_y=np.array([20,21,22,23])
Run Code Online (Sandbox Code Playgroud)

您可以将图像范围设置为

dx = (real_x[1]-real_x[0])/2.
dy = (real_y[1]-real_y[0])/2.
extent = [real_x[0]-dx, real_x[-1]+dx, real_y[0]-dy, real_y[-1]+dy]
plt.imshow(data, extent=extent)
Run Code Online (Sandbox Code Playgroud)

改变ticklabels

另一种方法是只更改ticklabels

real_x=np.array([15,16,17])
real_y=np.array([20,21,22,23])
plt.imshow(data)
plt.gca().set_xticks(range(len(real_x)))
plt.gca().set_yticks(range(len(real_x)))
plt.gca().set_xticklabels(real_x)
plt.gca().set_yticklabels(real_y)
Run Code Online (Sandbox Code Playgroud)

  • 如果`real_x`和`real_y`是固定宽度的单调增加,那个'extent`方法就可以工作.我假设这个问题是关于更普遍的*方法. (3认同)
  • Imshow图假定单调1像素比例,是的。其他一切都会使规模过时。因此,如果在轴范围内像素之间的差异不相同,则需要更改刻度标签。我还添加了仅设置ticklabels的解决方案。 (2认同)