итерационные маркеры на графиках - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь обозначить прогнозы цветом и правильными метками в качестве маркеров для набора данных радужной оболочки. Вот что у меня есть:

from sklearn.mixture import GMM
import pandas as pd
from sklearn import datasets
import matplotlib.pyplot as plt
import itertools

iris = datasets.load_iris()
x = iris.data
y = iris.target
gmm = GMM(n_components=3).fit(x)
labels = gmm.predict(x)
fig, axes = plt.subplots(4, 4)
Superman = iris.feature_names
markers = ["o" , "s" , "D"]
Mi=[]
for i in range(150):
  Mi.append(markers[y[i]])

for i in range(4):
    for j in range(4):
        if(i != j):
            axes[i, j].scatter(x[:, i], x[:, j], c=labels, marker = Mi, s=40, cmap='viridis')
        else:
            axes[i,j].text(0.15, 0.3, Superman[i], fontsize = 8)

Я не уверен, почему цвета повторяются, а маркеры - нет, но есть ли способ назначить каждому маркеру определенное значение, например, цвет? Это также дает сбой, когда я просто ввожу числовые значения от y

Код, который он возвращает:

Неопознанный стиль маркера ['o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o' , 'о', 'о', 'о', 'о', 'о', 'о', 'о', 'о', 'о', 'о', 'о', 'о', ' о ',' о ',' о ',' о ',' о ',' о ',' о ',' о ',' о ',' о ',' о ',' о ',' о ' , 'о', 'о', 'о', 'о', 'о', 'о', 'о', 'о', 'о', 'о', 'о', 'о', ' o ',' o ',' s ',' s ',' s ',' s ',' s ',' s ',' s ',' s ',' s ',' s ',' s ' , 's', 's', 's', 's', 's', 's', 's', 's', 's', 's', 's', 's', ' s ',' s ',' s ',' s ',' s ',' s ',' s ',' s ',' s ',' s ',' s ',' s ',' s ' , 's', 's', 's', 's', 's', 's', 's', 's', 's', 's', 's', 's', ' s ',' s ',' D ',' D ',' D ',' D ',' D ',' D ',' D ',' D ',' D ',' D ',' D ' , «D», «D», «D», «D», «D», «D», «D», «D», «D», «D», «D», «D», « D ',' D ',' D ',' D ',' D ',' D ',' D ',' D ',' D ',' D ',' D ',' D ',' D ' , «D», «D», «D», «D», «D», «D», «D», «D», «D», «D», «D», «D», « D ',' D ']

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Вы можете изменить свой код следующим образом, чтобы получить желаемый результат:

markers = ["o" , "s" , "D"]
colors = ["red", "green", "blue"]

for i in range(4):
    for j in range(4):
        for k in range(x.shape[0]):
            if(i != j):
                axes[i, j].scatter(x[k, i], x[k, j], color=colors[labels[k]], marker = markers[y[k]], s=40, cmap='viridis')  
            else:
                axes[i,j].text(0.15, 0.3, Superman[i], fontsize = 8)

enter image description here

0 голосов
/ 13 сентября 2018

Использование нескольких маркеров в одном разбросе в настоящее время не поддерживается Matplotlib.Тем не менее, имеется запрос функции для этого в https://github.com/matplotlib/matplotlib/issues/11155

Конечно, можно рисовать несколько скаттеров, по одному для каждого типа маркера.Другой вариант, который я предложил в вышеупомянутой теме: установить маркеры после создания разброса:

import numpy as np
import matplotlib.pyplot as plt

def mscatter(x,y,ax=None, m=None, **kw):
    import matplotlib.markers as mmarkers
    if not ax: ax=plt.gca()
    sc = ax.scatter(x,y,**kw)
    if (m is not None) and (len(m)==len(x)):
        paths = []
        for marker in m:
            if isinstance(marker, mmarkers.MarkerStyle):
                marker_obj = marker
            else:
                marker_obj = mmarkers.MarkerStyle(marker)
            path = marker_obj.get_path().transformed(
                        marker_obj.get_transform())
            paths.append(path)
        sc.set_paths(paths)
    return sc


N = 40
x, y, c = np.random.rand(3, N)
s = np.random.randint(10, 220, size=N)
m = np.repeat(["o", "s", "D", "*"], N/4)

fig, ax = plt.subplots()

scatter = mscatter(x, y, c=c, s=s, m=m, ax=ax)

plt.show()

enter image description here

Если выимеют только цифры, вместо символов маркеров сначала нужно сопоставить числа с символами и предоставить список символов для функции.

...