Использование меток класса в качестве цветовой разметки
что-то не выходит у меня нагуглить. Я могу легко реализовать это с помощью seaborn и hue. Но у меня задание курса использовать только matplotlib.
Данные, знаменитые Ирисы, загрузить можно так:
from sklearn import datasets
data = datasets.load_iris(return_X_y=False)
X = data.data
y = data.target
names = data.target_names
Полный текст задачи:
Нарисуйте точечную диаграмму (scatter plot) всех четырех признаков. Каждый признак должен быть нарисован на отдельном графике. Используйте для этого subplot формата 2 на 2. Графики должны быть читаемыми, т.е. отрегулируйте размер subplot'ов. Добовьте названия признаков к каждому графику в качестве имени графика. Используйте метки классов (y) в качестве цветовой разметки. Добавьте расшифровку цветов, соответствующих меткам классов, в качестве лейблов.
Мое решение:
f,axes = plt.subplots(2,2, sharex=False, sharey=False, figsize=(20,10))
plt.title('Iris')
axes[0,0].scatter(x=range(0, X.shape[0]) ,y=X[:,0], c=y)
axes[0,0].set_title('sepal length (cm)')
axes[0,1].scatter(x=range(0, X.shape[0]) ,y=X[:,1])
axes[0,1].set_title('sepal width (cm)')
axes[1,0].scatter(x=range(0, X.shape[0]) ,y=X[:,2])
axes[1,0].set_title('petal length (cm)')
axes[1,1].scatter(x=range(0, X.shape[0]) ,y=X[:,3])
axes[1,1].set_title('petal width (cm)')
plt.show()
Не могу сообразить как использовать в качестве цветов точек значения массива Y. Если использовать просто y, то получается так:
То есть он красит не первые 50 точек Х, а первые 50 на числовой прямой. Вот так выглядят данные на самом деле, много перекрытий:
Спасибо
Ответы (2 шт):
В общем проблема была не в цветах, а в моем понимании задания:
Если буквально следовать инструкции:
Каждый признак должен быть нарисован на отдельном графике.
То получаетеся нечто такое:
f, axes = plt.subplots(nrows = 2, ncols = 2, figsize=(15,15), sharex=True, sharey = True)
axes[0,0].scatter(X[:,0],y, c=y, cmap="viridis")
axes[0,0].set_title('sepal length (cm)')
axes[0,1].scatter(X[:,1],y, c=y, cmap="viridis")
axes[0,1].set_title('sepal width (cm)')
axes[1, 0].scatter(X[:,2],y, c=y, cmap="viridis")
axes[1,0].set_title('petal length (cm)')
axes[1,1].scatter(X[:,3],y, c=y, cmap="viridis")
axes[1,1].set_title('petal width (cm)')
plt.show()
Тут нужно поправить размерность и добавить легенду, с этим полагаю разберусь. Но у меня есть устойчивое ощущение, что я не верно понимаю задачу. Если кто предложит более корректное решение условия, поставлю "Лучший ответ". Спасибо.
как-то так:
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
colors = list(mcolors.TABLEAU_COLORS.values())
f,axes = plt.subplots(2,2, sharex=False, sharey=False, figsize=(20,10))
for i,ax in enumerate(axes.flatten()):
for target in np.unique(data.target):
mask = (y == target)
ax.scatter(x=np.arange(len(y[mask])), y=X[mask, i], c=colors[target])
ax.set_title(data.feature_names[i])
ax.legend(data.target_names)



