绘制具有不同色彩映射的两个分布的countour

时间:2018-02-22 15:25:26

标签: python matplotlib plot contour

我想绘制两个分布的contourf,用不同的颜色区分它们,而不是“一个在另一个之上”,而是在较低点之上有更高的分数

玩具示例:

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()

enter image description here

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

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

enter image description here

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

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

如何保持颜色而不让它们相互叠加?

1 个答案:

答案 0 :(得分:2)

当然,您可以互相掩盖两个轮廓。

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()

enter image description here