Matplotlib:如何让 imshow 从其他 numpy 数组读取 x、y 坐标?

新手上路,请多包涵

当你想用 imshow 绘制一个 numpy 数组时,你通常会这样做:

 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)

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

在此图像中, 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]])

这些值只是为了说明我的情况而编造的。 有没有办法强制 imshow 为 A 中的每个值分配相应的坐标对 (real_x,real_y)?

PS: 我不是在寻找对基于数组的 x 和 y 添加或减去某些东西以使它们匹配 _realx 和 _realy ,而是寻找从 _realx 和 _realy 数组 读取 这些值的东西。预期的结果是一个图像,其 x 轴为 _realx 值,y 轴为 _realy 值。

原文由 FaCoffee 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

设置范围

假设你有

real_x=np.array([15,16,17])
real_y=np.array([20,21,22,23])

您可以将图像范围设置为

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)

更改刻度标签

另一种方法是只更改刻度标签

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)

原文由 ImportanceOfBeingErnest 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果我理解正确的话,这是关于为 imshow 生成光栅,即给定 X - 图像坐标和 y - 值,为 imshow 生成输入矩阵。我不知道那个的标准功能,所以实现了它

import numpy as np

def to_raster(X, y):
"""
:param X: 2D image coordinates for values y
:param y: vector of scalar or vector values
:return: A, extent
"""
    def deduce_raster_params():
        """
        Computes raster dimensions based on min/max coordinates in X
        sample step computed from 2nd - smallest coordinate values
        """
        unique_sorted = np.vstack((np.unique(v) for v in X.T)).T
        d_min = unique_sorted[0] # x min, y min
        d_max = unique_sorted[-1] # x max, y max
        d_step = unique_sorted[1]-unique_sorted[0] # x, y step
        nsamples = (np.round((d_max - d_min) / d_step) + 1).astype(int)
        return d_min, d_max, d_step, nsamples

    d_min, d_max, d_step, nsamples = deduce_raster_params()
    # Allocate matrix / tensor for raster. Allow y to be vector (e.g. RGB triplets)
    A = np.full((*nsamples, 1 if y.ndim==1 else y.shape[-1]), np.NaN)
    # Compute index for each point in X
    ind = np.round((X - d_min) / d_step).T.astype(int)
    # Scalar/vector values assigned over outer dimension
    A[list(ind)] = y  # cell id
    # Prepare extent in imshow format
    extent = np.vstack((d_min, d_max)).T.ravel()
    return A, extent

然后可以将其与 imshow 一起使用,如下所示:

 import matplotlib.pyplot as plt
A, extent = to_raster(X, y)
plt.imshow(A, extent=extent)

请注意,由于 np.unique() 中的排序,deduce_raster_params() 在 O(n*log(n)) 而不是 O(n) 中工作 - 这简化了代码,并且可能不应该成为发送到 imshow 的问题

原文由 Yuri Feldman 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题