我想绘制两个分布的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()
不是我想要的,因为第二个情节是第一个。 所以我尝试沿第二轴取最大分布
plt.figure()
plt.contourf(X, Y, np.max(Z, axis=2),alpha=0.6)
plt.show()
现在它们看起来像我想要的那样,但我把它们混合在一起,所以我无法用不同颜色绘制它们(红色与蓝色)
我可以使用argmax知道哪个图给了我最大值,我可以创建一个索引矩阵,但我不知道如何告诉countourf使用这个矩阵来确定要使用的色图。
如何保持颜色而不让它们相互叠加?
答案 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()