感谢 matplotlib,如何在同一张图中显示具有重叠数据的多个图形?

How to display multiple graphs with overlapping data in the same figure thank to matplotlib?

我正在搜索以在同一图中使用不同轴 X、Y 和数据 Z 从颜色图或 contourf 函数绘制多个图形(这里是 2 个)。但是我只想用所有图表的单个颜色条显示每个数据的最大值。

在这个例子中,我创建了一个单独的图形,我在其中添加了每个图形,但第二个图形覆盖了第一个图形,无论它的数据是更低还是更高。

import matplotlib.pyplot as plt
import numpy as np

a = [1,0.25]

fig = plt.figure(1)
ax = fig.gca()

for i in range(2):
    x = np.linspace(-3, 3, 51)
    y = np.linspace(-2*a[i], 2*a[i], 41)

    X, Y = np.meshgrid(x, y)
    if i == 0:
        Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2)
    else:
        Z = 0.5*np.ones((41,51))

    graph = ax.contourf(X,Y,Z)  
    bar = fig.colorbar(graph)

plt.show()

Figure 1 displayed by the code

这是我要显示的内容:

Figure 2 desired

非常感谢, 特里斯坦

根据我们在您的 post 评论中的讨论,我认为您可以编辑您的代码来实现您想要的,如下所示。

首先,作为一般性评论,我建议您将变量移至脚本顶部。

其次,这是主要部分,如果您使用比较来测试要填充 Z 数组的值,则可以只绘制一张图。您可以使用 np.logical_and and then use np.where 链接多个比较,以使用函数值或常量值填充 Z 数组,具体取决于您是否在所需的 x 和 y 值框内以​​及函数值或期望的常数值最大。

fig = plt.figure()
ax = fig.gca()

xmin, xmax, nx = -3, 3, 51
ymin, ymax, ny = -2, 2, 41

# box values
xbmin, xbmax = -3, 3
ybmin, ybmax = -0.5, 0.5
zlevel = 0.5

x = np.linspace(xmin, xmax, nx)
y = np.linspace(ymin, ymax, ny)
X, Y = np.meshgrid(x,y)
Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2)

test1 = Z<zlevel
test2 = np.logical_and(X>=xbmin, X<=xbmax)
test3 = np.logical_and(Y>=ybmin, Y<=ybmax)

mask = np.logical_and(np.logical_and(test1, test2), test3)
Z = np.where(mask, zlevel*np.ones(Z.shape), Z)

graph = ax.contourf(X,Y,Z)
bar = fig.colorbar(graph)

plt.show()