使用 imshow 时的 xticks 和 yticks 问题

xticks and yticks issues while using imshow

我在修复 imshow 图的 xticksyticks 时遇到问题。当我为 imshow 使用单个图时,范围效果更好(见下面的第一张图)。但是,当我使用在 imshow 图上插入局部最大值的坐标时,刻度已经改变(第二个图)。有人能帮我在绘制局部最大值后修复 xticksyticks 吗?

import numpy as np
import matplotlib.pyplot as plt
from skimage.feature import peak_local_max

# Input of a 2D array/ 
data = np.real(data) # data link : https://www.file.io/LvDn/download/WqdRCoW2dUPV

# Find the coordinates of local maxima in the data
coordinates = peak_local_max(data, min_distance=8,  num_peaks=2) #, threshold_abs = 0.0004) #
# Display results

kf=2*2*np.pi/10
resolution = 40
N=9
kx = np.linspace(-kf, kf, N * resolution)  # space vector
ky = np.linspace(-kf, kf, N * resolution)  # space vector


fig, axes = plt.subplots(1, 2, figsize=(13, 8), sharex=True, sharey=True)
ax = axes.ravel()
ax[0].imshow(data, cmap='seismic', vmin=data.min(), vmax=data.max(),
                       extent=[kx.min(), kx.max(), ky.min(), ky.max()],
                       interpolation='nearest', origin='lower')
ax[0].axis('on')
ax[0].set_title('Original')

上面的代码片段生成了这个图:

在这里,imshow extent 工作正常,这是我想要的。当我使用脚本绘制局部最大值时,刻度将如下所示更改。

ax[1].imshow(data, cmap='seismic')
ax[1].autoscale(False)
ax[1].plot( coordinates[:, 1], coordinates[:, 0], 'k.', marker='o', markersize=12)
ax[1].axis('on')
ax[1].set_title('Peak_local_max')
fig.tight_layout()
plt.show()

[

如何修复“峰值局部最大值”图中的 xticksyticks

如果我使用第二个情节的脚本范围,那么图形如下所示:

很难确定您要的是什么,而且您提供的示例代码不起作用。例如 spec 等变量未定义。

但我猜主要问题是您混合了像素(来自 peak_local_max)和数据坐标。您可以使用以下方法修复:

extent = [kx.min(), kx.max(), ky.min(), ky.max()]

fig, ax = plt.subplots(1, 2, figsize=(13, 8), sharex=True, sharey=True)

ax[0].set_title('Original')
ax[0].imshow(data, cmap='seismic', extent=extent)

ax[1].set_title('Peak_local_max')
ax[1].imshow(data, cmap='seismic', extent=extent)
ax[1].plot(kx[coordinates[:, 1]], ky[coordinates[:, 0]], 'go', markersize=12)

Matplotlib用的extent应该也是outer extent,我不确定你的坐标数组kxky到底是不是这样。这可能会导致 mismatch/shift 分辨率的一半。