【问题标题】:scatter plot with legend colored by group without multiple calls to plt.scatter散点图,图例按组着色,无需多次调用 plt.scatter
【发布时间】:2017-05-15 03:37:17
【问题描述】:

pyplot.scatter 允许将与组对应的数组传递给c=,然后根据这些组对点进行着色。但是,这似乎不支持在没有专门分别绘制每个组的情况下生成图例。

因此,例如,可以通过迭代组并分别绘制每个组来生成带有彩色组的散点图:

import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
feats = load_iris()['data']
target = load_iris()['target']

f, ax = plt.subplots(1)
for i in np.unique(target):
    mask = target == i
    plt.scatter(feats[mask, 0], feats[mask, 1], label=i)
ax.legend()

生成:

我可以在不遍历每个组的情况下实现类似的绘图:

f, ax = plt.subplots(1)
ax.scatter(feats[:, 0], feats[:, 1], c=np.array(['C0', 'C1', 'C2'])[target])

但我无法想出用第二种策略生成相应图例的方法。我遇到的所有示例都对组进行了迭代,这似乎……不太理想。我知道我可以手动生成图例,但这似乎过于繁琐。

【问题讨论】:

    标签: python matplotlib legend scatter


    【解决方案1】:

    解决此问题的 matplotlib scatter 示例也使用了循环,因此这可能是预期的用法:https://matplotlib.org/examples/lines_bars_and_markers/scatter_with_legend.html

    如果您的更大目标只是让分类数据的绘图和标记更加简单,您应该考虑Seaborn。这是一个与Scatter plots in Pandas/Pyplot: How to plot by category类似的问题

    实现目标的一种方法是使用带有标签列的 pandas。在 Pandas Dataframe 中获得数据后,您可以使用Seaborn pairplot 制作这种绘图。 (Seaborn 还提供 iris 数据集作为标记的 DataFrame)

    import seaborn as sns
    iris = sns.load_dataset("iris")
    sns.pairplot(iris, hue="species")
    

    如果你只想要前两个功能,你可以使用

    sns.pairplot(x_vars=['sepal_length'], y_vars=['sepal_width'], data=iris, hue="species", size=5)
    

    如果您真的想使用 sklearn 数据字典,可以将其拉入数据框,如下所示:

    import pandas as pd
    from sklearn.datasets import load_iris
    import numpy as np
    
    feats = load_iris()['data'].astype('O')
    target = load_iris()['target']
    feat_names = load_iris()['feature_names']
    target_names = load_iris()['target_names'].astype('O')
    
    sk_df = pd.DataFrame(
        np.hstack([feats,target_names[target][:,np.newaxis]]),
        columns=feat_names+['target',])
    sns.pairplot(sk_df, vars=feat_names, hue="target")
    

    【讨论】:

    • 我知道你可以在 seaborn 中简单地做到这一点,但我的实际用例(我正在绘制 3D 散点图)seaborn 不支持。在引擎盖下 seaborn 正在使用 matplotlib 来实际进行绘图 - 我想我可以通过并查看 seaborn 如何在pairplot(或regplot)中生成散点图和相关的图形图例。我的猜测是它像我的第一个示例代码一样循环组。
    猜你喜欢
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2022-07-08
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多