Python 函数的实部/虚部等高线图的子图使用相同的颜色条

Python same colorbar for subplots of real / imaginary contour plots of function

我正在绘制一个从 MWA 生成的函数 z,如下所示:

import numpy as np
import matplotlib.pyplot as plt

ylist = np.linspace(0,10,20)
xlist = np.linspace(0,10,20)

zR = []                    # real part of z
zI = []                    # imaginary part of z

for y in ylist:
    for x in xlist:
        z = 0.2*x**2 + 1j*(x*y+0.7*np.sqrt(y))
        zR.append(z.real)
        zI.append(z.imag)

zR = np.array(zR)
z_matrixR = zR.reshape((ylist.size, xlist.size))

zI = np.array(zI)
z_matrixI = zI.reshape((ylist.size, xlist.size))

fig = plt.figure(figsize=(8.0,6.0))
ax1 = fig.add_subplot(221)    
z_contourR = ax1.contourf(xlist,ylist,z_matrixR,100)
plt.xlabel('x')
plt.ylabel('y')
plt.title('real')
#cbarR = plt.colorbar(z_contourR)

ax2 = fig.add_subplot(222)
z_contourI = ax2.contourf(xlist,ylist,z_matrixI,100)
plt.xlabel('x')
plt.ylabel('y')
plt.title('imaginary')
#cbarI = plt.colorbar(z_contourI)

plt.tight_layout()
plt.show()

我希望我的 z 函数的实部和虚部共享同一个颜色条,但我不确定该怎么做。我看过 this and this 示例,但仍不确定如何将其应用到我的代码中。

vminvmaxlevels 是你的朋友。您可能想要的 3 个选项:

绘制实部和虚部时使用相同的部分

fig = plt.figure(figsize=(8.0,6.0))
ax1 = fig.add_subplot(221)    

vmax=30
vmin=0
levels = np.linspace(vmin,vmax,100)

z_contourR = ax1.contourf(xlist,ylist,z_matrixR,levels=levels,vmax=vmax,vmin=vmin)
plt.xlabel('x')
plt.ylabel('y')
plt.title('real')
cbarR = plt.colorbar(z_contourR)

ax2 = fig.add_subplot(222)
z_contourI = ax2.contourf(xlist,ylist,z_matrixI,levels=levels,vmax=vmax,vmin=vmin)
plt.xlabel('x')
plt.ylabel('y')
plt.title('imaginary')
cbarI = plt.colorbar(z_contourI)

plt.tight_layout()
plt.show()

右上角是白色的,因为它不在我指定的 levels 范围内,您可以通过为 levelsvmax 选择不同的最大值来恢复它 这会创建一个看起来很有趣的颜色条,但在某些情况下您可能需要它

fig = plt.figure(figsize=(8.0,6.0))
ax1 = fig.add_subplot(221)    

vmax=30
levels_max=100
vmin=0
levels = np.arange(vmin,levels_max,.1)

z_contourR = ax1.contourf(xlist,ylist,z_matrixR,levels=levels,vmax=vmax,vmin=vmin)
plt.xlabel('x')
plt.ylabel('y')
plt.title('real')
cbarR = plt.colorbar(z_contourR)

ax2 = fig.add_subplot(222)
z_contourI = ax2.contourf(xlist,ylist,z_matrixI,levels=levels,vmax=vmax,vmin=vmin)
plt.xlabel('x')
plt.ylabel('y')
plt.title('imaginary')
cbarI = plt.colorbar(z_contourI)

plt.tight_layout()
plt.show()

现在,如果您想要右上角填充和颜色条看起来正确,您应该重新定义绘图之间的 levels 并使用第一个颜色条绘制两者

fig = plt.figure(figsize=(8.0,6.0))
ax1 = fig.add_subplot(221)    

vmax=30
levels_max=30
vmin=0
levels = np.linspace(vmin,levels_max,100)

z_contourR = ax1.contourf(xlist,ylist,z_matrixR,levels=levels,vmax=vmax,vmin=vmin)
plt.xlabel('x')
plt.ylabel('y')
plt.title('real')
cbarR = plt.colorbar(z_contourR)

vmax=30
levels_max=100
vmin=0
levels = np.linspace(vmin,levels_max,100)


ax2 = fig.add_subplot(222)
z_contourI = ax2.contourf(xlist,ylist,z_matrixI,levels=levels,vmax=vmax,vmin=vmin)
plt.xlabel('x')
plt.ylabel('y')
plt.title('imaginary')
cbarI = plt.colorbar(z_contourR)

plt.tight_layout()
plt.show()