将线图添加到 imshow 并更改轴标记

adding line plot to imshow and changing axis marker

我使用以下代码制作了附件图:

a = 1
theta = np.linspace(0,2*np.pi,101)
x = np.linspace(-3*a,3*a,1001, dtype='complex')
y = np.linspace(-3*a,3*a,1001, dtype='complex')
X,Y = np.meshgrid(x,y)

# come manipulations with V
# (same shape and type as X,Y) not shown here 

plt.subplot(1,2,1)
plt.scatter(a*np.cos(theta), a*np.sin(theta))
plt.imshow(V.real)
plt.colorbar()
plt.subplot(1,2,2)
plt.scatter(a*np.cos(theta), a*np.sin(theta))
plt.imshow(V.imag)
plt.colorbar()

我想做的是:

1) 更改绘图的比例,使水平和垂直轴在 -3*a 和 3*a 之间变化

2) 绘制圆边界(以原点为中心,半径 = a)。现在它出现在左上角,因为绘图的比例从 [-3*a,3*a] 更改为数组的大小。

一般来说,您正在寻找 extent 关键字到 imshow

举个简单的例子:

import numpy as np
import matplotlib.pyplot as plt

data = np.random.random((10, 10))

fig, ax = plt.subplots()
ax.imshow(data, extent=[10, 30, np.pi, -2*np.pi])
plt.show()

以你给出的例子为例:

import numpy as np
import matplotlib.pyplot as plt

a = 1
theta = np.linspace(0, 2*np.pi, 100)

# We could replace the next three lines with:
# y, x = np.mgrid[-3*a:3*a:1000j, -3*a:3*a:1000j]
x = np.linspace(-3*a, 3*a, 1000)
y = np.linspace(-3*a, 3*a, 1000)
x, y = np.meshgrid(x, y)

# Now let's make something similar to your V for this example..
r = np.hypot(x, y)
V = np.cos(3*np.arctan2(y, x)) + np.sin(r) + np.cos(x)*1j * np.cos(r)

def plot(ax, data):
    ax.plot(a*np.cos(theta), a*np.sin(theta), color='black')
    im = ax.imshow(data, extent=[x.min(), x.max(), y.max(), y.min()])
    fig.colorbar(im, ax=ax, shrink=0.5)

fig, (ax1, ax2) = plt.subplots(ncols=2)

ax1.set(title='Real Portion')
plot(ax1, V.real)

ax2.set(title='Imaginary Portion')
plot(ax2, V.imag)

plt.show()

不过,您也可以考虑在这种情况下使用 pcolormesh。例如,我们可以将 plot 函数更改为:

def plot(ax, data):
    ax.plot(a*np.cos(theta), a*np.sin(theta), color='black')
    im = ax.pcolormesh(x, y, data)
    ax.set(aspect=1)
    fig.colorbar(im, ax=ax, shrink=0.5)

主要区别是:

  1. imshow 可以插值,而 pcolormesh 给出矢量输出并且不能插值(即它绘制很多矩形而不是图像)。
  2. pcolormesh有点慢,所以对于大图,imshow是更好的选择。
  3. imshowpcolormesh 对范围的处理略有不同。 imshow 是 "cell-centered" 而 pcolormesh 是 "mesh-centered"。这是一个 half-pixel 差异,因此在这种情况下您可以忽略它。
  4. imshow 会将绘图的纵横比设置为 1,因此 x-direction 中的一个单元与 y-direction 中的一个单元大小相同。默认情况下,它还会翻转 y-axis。

另一个注意事项:如果您不希望翻转 y-axis,请调用 ax.invert_yaxis() 或使用 origin='lower'extent=[xmin, xmax, ymin, ymax]