Python 在Matplotlib和contourf中使用带遮罩阵列的多颜色贴图

Python 在Matplotlib和contourf中使用带遮罩阵列的多颜色贴图,python,matplotlib,Python,Matplotlib,我试图在训练的渐进阶段在2D平面上可视化分类模型的输出。我正在生成有四个类的模拟数据,该模型生成softmax输出-对于网格中的每个数据点,该模型生成一个长度为四的向量,比如:[0.1,0.5,0.2,0.2],表示该模型给出该数据点在每个类中的概率。在这种情况下,我们会说模型预测了数据点的类别1,因为这是四个类别中概率最高的 我想做的是使用模型的预测和模型给出的概率来可视化分类器的决策边界。我想,对于网格上的每个数据点,颜色表示模型预测的类别,颜色的暗度表示概率,0.25表示白色,1.0表示渐

我试图在训练的渐进阶段在2D平面上可视化分类模型的输出。我正在生成有四个类的模拟数据,该模型生成softmax输出-对于网格中的每个数据点,该模型生成一个长度为四的向量,比如:[0.1,0.5,0.2,0.2],表示该模型给出该数据点在每个类中的概率。在这种情况下,我们会说模型预测了数据点的类别1,因为这是四个类别中概率最高的

我想做的是使用模型的预测和模型给出的概率来可视化分类器的决策边界。我想,对于网格上的每个数据点,颜色表示模型预测的类别,颜色的暗度表示概率,0.25表示白色,1.0表示渐变中最暗的颜色。(0.25为白色,因为[0.25,0.25,0.25,0.25]是模型可能最混乱的部分)。我使用以下代码生成我的绘图,它比较了两个非常相似的模型:

f, (ax1, ax2) = plt.subplots(2, figsize=(4, 7), dpi=80, sharex=True,       sharey=True)
f.suptitle("Training Set and Decision Boundary, Batch={0}".format(batch))
f.tight_layout(rect=[0, 0.03, 1, 0.95])

cmaps = ["Purples","Greens","Oranges","Blues"]

ax1.set_title("Baseline Model")
ax1.set_xlim([-10,10])
ax1.set_ylim([-10,10])
ax2.set_title("Modified Model")
ax2.set_xlim([-10,10])
ax2.set_ylim([-10,10])

u = np.unique(p1)

# Loop through the predicted classes, using a masked array to set the points predicted to be that class

for i in range(len(u)):
    c = u[i]

    xx_tmp = np.ma.masked_array(xx, p1 == c)
    yy_tmp = np.ma.masked_array(yy, p1 == c)
    z_tmp = np.ma.masked_array(z1, p1 == c)

    ax1.contourf(xx_tmp, yy_tmp, z_tmp, cmap=cmaps[c])

u = np.unique(p2)

for i in range(len(u)):
    c = u[i]

    xx_tmp = np.ma.masked_array(xx, p2 == c)
    yy_tmp = np.ma.masked_array(yy, p2 == c)
    z_tmp = np.ma.masked_array(z2, p2 == c)

    ax2.contourf(xx_tmp, yy_tmp, z_tmp, cmap=cmaps[c])


plt.savefig(VIS_DIR + "Batch{0}.png".format(batch))
plt.gcf().clear()
我使用100 x 100网格中的10000点来给出轮廓函数。z1和z2是100 x 100 numpy阵列,存储每个数据点的预测向量中的最高概率。p1和p2是100 x 100数组,用于存储每个数据点的预测类(0、1、2、3)

这段代码可以正常工作,但出于某种原因,我最多只能得到两种颜色,我不明白为什么(我已经验证了我的预测数组中有正确的标签)。以下是两个例子:

很容易看到决策边界在哪里,也很容易看到四个类以及通过更多培训增加的模型信心。但是为什么三个班级都是蓝色的呢?我最多只能得到两种颜色。如果我在CMAP列表中重新排列颜色,那么我得到的颜色就会改变,因此我认为这与matplotlib覆盖以前的过程有关。这里有什么不正确的地方吗?我应该使用掩蔽阵列和contourf,还是有更简单的方法


谢谢

您的代码未运行,请参阅。所以我们必须在这里猜测。可能,您在这里屏蔽了错误的区域。与屏蔽当前循环索引等于您可能要屏蔽的类的区域不同,
np.ma.masked_数组(xx,p1!=c)
。您在所有方面都是正确的。我省略了构造数据的代码部分,因为我不希望代码块太长。以后我会写一个简单的案例。你解决了!我掩盖了我想要的,而不是我不想要的。我将脚本更改为使用masked_where并反转了条件,现在它按预期工作。谢谢两种选择:如果你认为这个问题对未来的读者有用,请自己提供答案,你可以在2天内回答。如果没有,您也可以将其删除。您的代码未运行,请参阅。所以我们必须在这里猜测。可能,您在这里屏蔽了错误的区域。与屏蔽当前循环索引等于您可能要屏蔽的类的区域不同,
np.ma.masked_数组(xx,p1!=c)
。您在所有方面都是正确的。我省略了构造数据的代码部分,因为我不希望代码块太长。以后我会写一个简单的案例。你解决了!我掩盖了我想要的,而不是我不想要的。我将脚本更改为使用masked_where并反转了条件,现在它按预期工作。谢谢两种选择:如果你认为这个问题对未来的读者有用,请自己提供答案,你可以在2天内回答。如果没有,您也可以删除它。