使用imshow进行x轴变换

问题描述 投票:0回答:1

我正在尝试使用(301,5)绘制形状为imshow的数组。

plt.imshow(M*100, norm=norm, cmap=cmap, origin='lower', aspect="auto",
            extent=[x.min(), x.max(), center[0]+dy/2, center[1]-dy/2],
            interpolation='nearest')

一切都很好,但是我必须对x轴数据进行转换:x**-1(具体来说,我将波长转换为波数)。轴将按原样进行转换,但由于反转操作引起的拉伸,因此imshow绘制的数据不会重塑。

这里是imshow输出:

“显示输出”

这是使用pcolormesh的正确输出,但是pcolormesh省略了一行...

plt.pcolormesh(x**-1 *1e4, y, M*100, vmax=9, cmap=cmap)

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9wUGJKWi5wbmcifQ==” alt =“ pcolormesh output”>

y轴的范围选项是将标签放置在中心。

解决这个问题的任何想法?

PS:我不使用pcolormesh,它可以正确转换轴,但只会绘制(300,4)的数组。

python matplotlib imshow
1个回答
0
投票

pcolormesh不会省略线,它会为网格的所有顶点分配值,然后对它们进行插值。

Note that the dimensions of X and Y should be one greater than those of C. Alternatively, X, Y and C may have equal dimensions, in which case the last row and column of C will be ignored.

一种可能的方法是调用pcolormesh 5次,每行一次。请注意,在这种情况下,M的最后一列也会被删除,除非您人为地向x添加了一个条目。

from matplotlib import pyplot as plt
import numpy as np

x = np.linspace(1/1200, 1/3200, 301)
y = np.arange(0.5, 5.5, 1)
X, Y = np.meshgrid(x, y)
M = np.sin(X * 40000 + Y / 2)
# plt.imshow(M, aspect='auto', interpolation='nearest')

for i in range(5):
    plt.pcolormesh(1/x, [i+0.5, i+1.5], [M[i,:]])
plt.show()

example plot

PS:正如您所指出的,显然,它也可以仅添加一个额外的y值。该y值以及x的最后一个将被忽略。

from matplotlib import pyplot as plt
import numpy as np

x = np.linspace(1/1200, 1/3200, 301)
y = np.arange(0.5, 6.5, 1)
X, Y = np.meshgrid(x, y)
M = np.sin(X * 40000 + Y / 2)

plt.pcolormesh(1/x, y, M)
© www.soinside.com 2019 - 2024. All rights reserved.