绘制具有不同颜色图的两个分布的等高线

Plot countour of two distributions with different colormaps

我想绘制两个分布的 contourf,用不同的颜色区分它们,并且没有 "one on top of another" 而是在较低的点之上有较高的点

玩具示例:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

x = np.arange(-3.0, 3.0, 0.1)
y = np.arange(-2.0, 2.0, 0.1)
X, Y = np.meshgrid(x, y)

Z = np.zeros((len(y), len(x), 2))
Z[:,:,0] = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z[:,:,1] = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)

好的,让我们绘制它们:

plt.figure()
plt.contourf(X, Y, Z[:,:,0], cmap='Reds', alpha=0.6)
plt.contourf(X, Y, Z[:,:,1], cmaps='Blues', alpha=0.6)
plt.show()

不是我想要的,因为第二个情节在第一个情节之上。 所以我尝试取沿第二个轴的分布的最大值

plt.figure()
plt.contourf(X, Y, np.max(Z, axis=2),alpha=0.6)
plt.show()

现在它们看起来像我想要的,但我混合了它们,所以我无法用不同的颜色(红色 vs 蓝色)绘制它们

我可以使用 argmax 知道哪个图给了我最大值,我可以创建一个索引矩阵,但我不知道如何告诉 countourf 使用这个矩阵来确定要使用的颜色图。

如何保持颜色而不是让它们重叠在一起?

当然,您可以互斥地屏蔽两个轮廓。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

x = np.arange(-3.0, 3.0, 0.1)
y = np.arange(-2.0, 2.0, 0.1)
X, Y = np.meshgrid(x, y)

Z = np.zeros((len(y), len(x), 2))
Z[:,:,0] = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z[:,:,1] = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
mask = Z[:,:,0] > Z[:,:,1]
plt.figure()
plt.contourf(X, Y, np.ma.array(Z[:,:,0], mask=~mask), cmap='Reds', 
             alpha=0.6)
plt.contourf(X, Y, np.ma.array(Z[:,:,1], mask=mask), cmap='Blues', 
             alpha=0.6)
plt.show()