这里有两种方法。
规则散点图的点可以具有内部颜色和边缘颜色。scatter
接受其中之一的数组,但不接受两者的数组。因此,您可以迭代所有边缘颜色并将它们绘制在同一图上的循环中。
使用线宽可能有助于将真实颜色和预测颜色一起可视化。
Matplotlib 的plot
函数接受标记填充样式,有可能是双色的,无论是上下还是左右。每个图只能给出一种类型的样式。因此,对于 5 种颜色,可以循环绘制 25 种组合。
奖励积分:
在循环颜色时,绘图可以生成带有相应双色点的图例标签。
下面是一些代码来说明这些概念:
from matplotlib import pyplot as plt
from matplotlib.collections import LineCollection
import numpy as np
N = 50
labels = ['ant', 'bee', 'cat', 'dog', 'elk'] # suppose these are the labels for the prediction
colors = list('rgbkm') # a list of 5 colors
cols_true = np.repeat(range(5), N) # suppose the first N have true color 0, the next N true color 1, ...
cols_pred = np.random.randint(0, 5, N * 5) # as a demo, take a random number for each predicted color
# for x and y, suppose some 2D gaussian normal distribution around some centers,
# this would make the 'true' colors nicely grouped
x = np.concatenate([np.random.normal(cx, 2, N) for cx in [5, 9, 7, 2, 2]])
y = np.concatenate([np.random.normal(cy, 1.5, N) for cy in [2, 5, 9, 8, 3]])
fig, ax = plt.subplots(figsize=(10,6))
for tc in range(5):
for pc in range(5):
mask = (cols_true == tc) & (cols_pred == pc)
plt.plot(x[mask], y[mask], c=colors[tc], markerfacecoloralt=colors[pc],
marker='.', linestyle='', markeredgecolor='None',
markersize=15, fillstyle='left', markeredgewidth=0,
label=f'Tr: {labels[tc]} - Pr: {labels[pc]}')
plt.legend(loc='upper right', bbox_to_anchor=(1, -0.1), fontsize=10, ncol=5)
plt.tight_layout()
plt.show()