Как создать точечный график с двумя цветами на точку? - PullRequest
2 голосов
/ 19 января 2020

Я пытаюсь построить одновременно и основную правду и мою мою классификацию одновременно в matplotlib.

В настоящее время я строю только большую гордость, после применение tsne к пространству объектов и добавление ребер с использованием следующего кода

from matplotlib.collections import LineCollection
cols=['rgbkm'[lbl] for lbl in list(data.y.cpu().numpy() - 1)]

lc = LineCollection(X_embedded[out_dict['edges']],linewidth=0.05)
fig = plt.figure()
plt.gca().add_collection(lc)
plt.xlim(X_embedded[:,0].min(), X_embedded[:,0].max())
plt.ylim(X_embedded[:,1].min(), X_embedded[:,1].max())
plt.scatter(X_embedded[:,0],X_embedded[:,1], c=cols)

Это дает следующий график: enter image description here

Хотя, я надеюсь, каким-то образом раскрасить каждую вершину следующим образом:

enter image description here

1 Ответ

2 голосов
/ 21 января 2020

Вот два подхода.

Точки обычных диаграмм рассеяния могут иметь цвет интерьера и цвет кромки. scatter принимает массив для одного из них, но не для обоих. Таким образом, вы можете просто перебрать все граничные цвета и нанести их на oop на одном графике. Игра с шириной линии может помочь визуализировать истинный и предсказанный цвета вместе.

Функция plot Matplotlib принимает маркер стилей заполнения , которые могут быть двухцветными, либо сверху вниз или влево-вправо. За сюжет можно дать только один тип стиля. Таким образом, для 5 цветов существует 25 комбинаций, которые можно нарисовать в oop.

Бонусные баллы:

При циклическом переходе между цветами в сюжете могут создаваться надписи легенды с соответствующим двухцветным цветом. точка.

Вот код, иллюстрирующий понятия:

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

resulting plot

...