web-dev-qa-db-ja.com

plt.scatterを複数回呼び出さずに、凡例をグループごとに色分けした散布図

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

生成するもの:

enter image description here

ただし、各グループを繰り返すことなく、同様のプロットを実現できます。

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

しかし、この2番目の戦略で対応する凡例を生成する方法を理解することはできません。私が出くわしたすべての例は、グループを繰り返し処理しますが、これは...理想的とは言えません。手動で凡例を生成できることは知っていますが、これも非常に面倒なようです。

5
dan_g

この問題に対処するmatplotlibスキャッターの例もループを使用しているため、おそらく意図された使用法です: https://matplotlib.org/examples/lines_bars_and_markers/scatter_with_legend.html

より大きな目標がカテゴリデータのプロットとラベル付けをより簡単にすることである場合は、 Seaborn を検討する必要があります。これは パンダ/パイロットの散布図:カテゴリ別にプロットする方法 と同様の質問です。

目標を達成する方法は、ラベル付きの列でpandasを使用することです。Pandasデータフレームにデータがあると、 Seaborn pairplot この種のプロットを作成します(Seabornには、ラベル付きDataFrameとして使用可能な虹彩データセットもあります)

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

enter image description here

最初の2つの機能だけが必要な場合は、次を使用できます。

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

enter image description here

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")
2
Bob Baxley