質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1831閲覧

Seabornの散布図で各プロットに色を付けたい。ValueError: The palette list has the wrong number of colors.

i113

総合スコア74

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/09/01 09:09

編集2022/09/02 06:08

Seabornの散布図でプロットを色分けしたいと思い次のコードを書きました。

python

1sns.scatterplot(x=data['block'], y=data[col], hue=data2[col], s=100) 2plt.savefig(graph_path + col+r".svg")

おおむね狙い通りの図が描けたのですが、色味が気に入らなかったので次のように書き換えました。

python

1colp = sns.blend_palette(['grey', 'yellow', 'red'], 3) 2sns.scatterplot(x=data['block'], y=data[col], hue=data2[col], palette=colp, s=100) 3plt.savefig(graph_path + col+r".svg") 4567ValueError: The palette list has the wrong number of colors.

パレットの色数が気に入らないといわれたので、3を1~4まで、および"なし"で変化させましたが同じ結果でした。
ちなみに data2[col] がとりうるあたいは、0,1,2のどれかです。
どうしたら良いでしょうか?

どうやら失敗しているパターンでは、print(set(data2[col]))の結果が{0,1}のようです。
0,1,2のどれが含まれているか含まれていないかにかかわらず、
0->grey
1->yellow
2->red
となるようにしたいのですが。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2022/09/02 01:53

colp = ['grey', 'yellow', 'red'] で、どうでしょうか?
i113

2022/09/02 03:27

どうも有り難うございます。 やってみましたが、同じ結果になります。
can110

2022/09/02 05:37

> ちなみに data2[col] がとりうるあたいは、0,1,2のどれかです。 hueだけはdataではなくdata2のほうを参照しているのですね。 これが確実か確認したいので、「print(set(data2[col]))」した結果(「{0,1,2}」になっているか?)を質問本文に追記ください。
guest

回答1

0

ベストアンサー

どうやら失敗しているパターンでは、print(set(data2[col]))の結果が{0,1}のようです。

コード全体の動きが不明ですが、col毎にカテゴリ数が異なるのであれば、以下のような感じでそれに応じたパレットをつど作成すればよいかと思います。

Python

1base_colors = ['grey', 'yellow', 'red'] # 最大のカテゴリ数分だけ用意しておく 23N = len(set(data2[col])) 4colors = base_colors[:N] 5colp = sns.blend_palette(colors, N)

追記

↑だと[1,2]のようにカテゴリが0から連続していないと、同じ値なのにcol毎に色が異なることになります。
よって、以下のような値と色の辞書を指定するとよいと思います。

Python

1colp = {0:'grey', 1:'yellow', 2:'red'}

投稿2022/09/02 06:21

編集2022/09/02 07:56
can110

総合スコア38352

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2022/09/02 07:01 編集

それだと、data2が0, 2だけや1, 2だけの場合に、 > 0,1,2のどれが含まれているか含まれていないかにかかわらず、 0->grey 1->yellow 2->red となるようにしたい とはならず、数字とは無関係に、一つ目がgray、二つ目がyellowになりませんか?
i113

2022/09/02 07:34

どうも有り難うございます。参考にさせていただき、次のようにしたら解決しました。 colors = ['grey', 'yellow', 'red'] colp = [] for i in set(data2[col]): colp.append(colors[i]) colp = sns.blend_palette(colp,len(colp))
can110

2022/09/02 07:52

> jbpb0さん ですね。。 というか単純に「colp = {0:'grey', 1:'yellow', 2:'red'}」という辞書で試してみたら動作しました。 このほうがよさそうです。
jbpb0

2022/09/02 10:57 編集

質問者さん > 次のようにしたら解決しました。 下記の行、要りますか? colp = sns.blend_palette(colp,len(colp)) 当方のmacのpythonで、下記のようにして適当にデータを作って確認したところ、「sns.blend_palette()」の行が有っても無くても表示されるグラフは同じでした import numpy as np import seaborn as sns import matplotlib.pyplot as plt X = np.random.normal(0, 10, 100) Y = [np.random.normal(0, 5)+i*1.3 for i in X] M = np.random.randint(0, 2, 100)+1 colors = ['grey', 'yellow', 'red'] colp = [] for i in set(M): colp.append(colors[i]) #colp = sns.blend_palette(colp, len(colp)) sns.scatterplot(x=X, y=Y, hue=M, palette=colp, s=100) plt.show()
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問