Мне нужна помощь, чтобы выделить/окрасить определенные точки данных на графике параллельных координат. Кажется, я не могу найти способ, который работает.
По сути, я хочу построить все данные, как показано ниже, а затем взять, например, индекс [0, 1, 2] точек данных и покрасить их в третий цвет, чтобы выделить их (и, если возможно, также сделать их толще?) Любой предложения?
from sklearn import datasets
from yellowbrick.features import ParallelCoordinates
iris = datasets.load_iris()
X = iris.data[:, :]
y = iris.target
features = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
classes = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']
title = "Plot over Iris Data"
# Instantiate the visualizer
visualizer = ParallelCoordinates(
classes=classes, features=features, fast=False, alpha=.40, title=title)
# Fit the visualizer and display it
visualizer.fit_transform(X, y)
visualizer.finalize() # creates title, legend, etc.
visualizer.ax.tick_params(labelsize=22) # change size of tick labels
visualizer.ax.title.set_fontsize(30) # change size of title
for text in visualizer.ax.legend_.texts: # change size of legend texts
text.set_fontsize(20)
visualizer.fig.tight_layout() # fit all texts nicely into the surrounding figure
visualizer.fig.show()
В настоящее время ParallelCoordinates.draw()
повторяет точки данных по порядку. Следовательно, дочерние Line2D
экземпляры visualizer.ax
будут следовать порядку данных. Следовательно, вы можете сделать:
from sklearn import datasets
from yellowbrick.features import ParallelCoordinates
# New code ----------------------
import matplotlib.pyplot as plt
special_lines = [0, 1, 2]
# Put any property you want here.
special_properties = {'linestyle': '--', 'color': 'k',
'linewidth': 5, 'zorder': float('inf'),
'alpha': 1}
# End of new code ---------------
iris = datasets.load_iris()
X = iris.data[:, :]
y = iris.target
features = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
classes = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']
title = "Plot over Iris Data"
# Instantiate the visualizer
visualizer = ParallelCoordinates(
classes=classes, features=features, fast=False, alpha=.40, title=title)
# Fit the visualizer and display it
visualizer.fit_transform(X, y)
# New code ----------------------
for line in [visualizer.ax.get_lines()[i] for i in special_lines]:
plt.setp(line, **special_properties)
# End of new code ---------------
visualizer.finalize() # creates title, legend, etc.
visualizer.ax.tick_params(labelsize=22) # change size of tick labels
visualizer.ax.title.set_fontsize(30) # change size of title
for text in visualizer.ax.legend_.texts: # change size of legend texts
text.set_fontsize(20)
visualizer.fig.tight_layout() # fit all texts nicely into the surrounding figure
visualizer.fig.show()
Результат:
Обратите внимание, что то, что строки добавляются по порядку, в документации не написано, просто так это реализовано. Следовательно, может быть (хотя я этого не ожидаю), что они изменят это поведение в будущих обновлениях. Более безопасным способом было бы вручную проверить, соответствуют ли данные строки преобразованным данным, используемым визуализатором. Обратите внимание, что мы используем необходимость для использования преобразованных данных в целом, потому что ParallelCoordinates
также реализует нормализатор. Это не ваш случай, а вообще надо сделать так:
# Perform AFTER visualizer.fit_transform(X, y).
import numpy as np
transformed_data = list(visualizer.transform(X[special_lines, :]))
for line in visualizer.ax.get_lines():
for i, arr in enumerate(transformed_data[:]):
if np.array_equal(arr, line.get_data()[1]):
plt.setp(line, **special_properties)
break
Это здорово, и действительно помогло мне понять, спасибо!