突出显示并行坐标图的特定数据点

发布于 2025-01-29 02:36:29 字数 1060 浏览 2 评论 0 原文

我正在寻找帮助/颜色的特定数据点在并行坐标图上。我似乎找不到方法。

本质上,我想绘制所有数据如下,然后取,例如,数据点的索引[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()

I'm looking for help to highlight/color particular data points on the parallel coordinates plot. I can't seem to find a way that work.

Essentially, I want to plot all the data as below, and then take, e.g., index [0, 1, 2] of the data points and color them a third color to highlight them (and if possible also make them thicker?) Any suggestions?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

折戟 2025-02-05 02:36:29

当前, 按顺序迭代数据点。因此,儿童 line2d 可视化器的实例将遵循数据的顺序。因此,您可以做:

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

Currently, ParallelCoordinates.draw() iterates the datapoints in order. Hence, the child Line2D instances of visualizer.ax will follow the order of the data. Hence, you can do:

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

Result:

enter image description here

Please note that the fact that lines are added in-order is not written in the documentation, it's just how it is implemented. Hence, it could be (even though I don't expect it) that they will change this behavior in future updates. A safer way would be to manually check whether the line's data matches the transformed data used by the visualizer. Note that we need to use the transformed data in general, because ParallelCoordinates also implements a normaliser. It's not your case, but in general we should do so:

# 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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文