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

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

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

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3775閲覧

自分で作ったデータに対して、seabornのhueを指定するには

morin

総合スコア57

Matplotlib

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/04/22 19:48

ペアプロットを、アイリス以外のデータで作ってみたくて国数英理社の点数を理系と文系で得意不得意が偏るようにデータを作成しました。

ペアプロット図は作成できたのですが、全部青い点なので、科目ごとに色を変えて表示したいと思いました。しかし、パラメータhueにどのような値を入力すれば良いのかわかりません。irisのデータセットの場合はspeciesだったり、それぞれのデータセットに特有の指定方法があるみたいですが、自分で作った場合はどうやって指定すればよいのでしょうか?

回答お願いします m(__)m

%matplotlib inline import pandas as pd import numpy as np import seaborn as sns sns.set() datas = [] for i in range(1, 101): if i % 2 == 0: data = [] data.append(random.randint(70, 100)) data.append(random.randint(70, 100)) data.append(random.randint(70, 100)) data.append(random.randint(20, 70)) data.append(random.randint(20, 70)) datas.append(data) else: data = [] data.append(random.randint(20, 70)) data.append(random.randint(20, 70)) data.append(random.randint(20, 70)) data.append(random.randint(70, 100)) data.append(random.randint(70, 100)) datas.append(data) index = [] for i in range(1, 101): index.append("student{}".format(i)) df = pd.DataFrame(datas, index=index, columns=["japanese", "english", "society", "math", "science"]) sns.pairplot(df)

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、hue の用途ですが、「科目毎に色を変えて」とは少し意味合いが違います。
hue を使う場合はデータにもう1つカテゴリー列を追加して、そのカテゴリー毎に分布がどのようになっているかを色分けして表示できます。

例えば、質問のコードを例にとると、この生徒が「文系クラス」に所属する生徒か「理系クラス」に所属する生徒かを識別するカテゴリー列を作成して、その所属クラス毎に色分けする といった使い方ををます。

上記の例を質問のコードに追記して書くと、こんな感じになります。

Python

1%matplotlib inline 2import pandas as pd 3import numpy as np 4import seaborn as sns 5 6sns.set() 7 8datas = [] 9for i in range(1, 101): 10 if i % 2 == 0: 11 data = [] 12 data.append(np.random.randint(70, 100)) 13 data.append(np.random.randint(70, 100)) 14 data.append(np.random.randint(70, 100)) 15 data.append(np.random.randint(20, 70)) 16 data.append(np.random.randint(20, 70)) 17 data.append('文系クラス') 18 datas.append(data) 19 else: 20 data = [] 21 data.append(np.random.randint(20, 70)) 22 data.append(np.random.randint(20, 70)) 23 data.append(np.random.randint(20, 70)) 24 data.append(np.random.randint(70, 100)) 25 data.append(np.random.randint(70, 100)) 26 data.append('理系クラス') 27 datas.append(data) 28index = [] 29for i in range(1, 101): 30 index.append("student{}".format(i)) 31df = pd.DataFrame(datas, index=index, columns=["japanese", "english", "society", "math", "science", "class"]) 32 33sns.pairplot(df, hue='class')

イメージ説明

次に質問の「科目毎に色を変えて」ですが、これば結構面倒です。。。

sns.pairplot() にはそのような用途用のパラメータがありませんので、 sns.PairGrid() を使って色を変える部分は自分で記述することになります。
一応、X側に割り当てられた科目毎に色を変えるサンプルを記述しましたので、参考にしてみてください。

Python

1%matplotlib inline 2import pandas as pd 3import numpy as np 4import seaborn as sns 5import matplotlib.pyplot as plt 6 7sns.set() 8 9datas = [] 10for i in range(1, 101): 11 if i % 2 == 0: 12 data = [] 13 data.append(np.random.randint(70, 100)) 14 data.append(np.random.randint(70, 100)) 15 data.append(np.random.randint(70, 100)) 16 data.append(np.random.randint(20, 70)) 17 data.append(np.random.randint(20, 70)) 18 datas.append(data) 19 else: 20 data = [] 21 data.append(np.random.randint(20, 70)) 22 data.append(np.random.randint(20, 70)) 23 data.append(np.random.randint(20, 70)) 24 data.append(np.random.randint(70, 100)) 25 data.append(np.random.randint(70, 100)) 26 datas.append(data) 27index = [] 28for i in range(1, 101): 29 index.append("student{}".format(i)) 30df = pd.DataFrame(datas, index=index, columns=["japanese", "english", "society", "math", "science"]) 31 32# 散布図を書く関数 33def my_scatter(x, y, **kwargs): 34 # 科目に対する色を指定 35 colors = {"japanese":"red", 36 "english":"blue", 37 "society":"yellow", 38 "math":"pink", 39 "science":"green"} 40 # x.nameの種類により色を設定する 41 kwargs['color'] = colors[x.name] 42 plt.scatter(x, y, **kwargs) 43 44g = sns.PairGrid(df) 45# 対角線上は、単なるヒストグラムを描画 46g.map_diag(plt.hist) 47# 対角線以外は、独自の散布図関数を呼ぶ 48g.map_offdiag(my_scatter)

イメージ説明

投稿2020/04/23 00:55

編集2020/04/23 01:08
magichan

総合スコア15898

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

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

morin

2020/04/23 19:58

回答ありがとうございます!! なるほど、そもそも使う用途が違いましたか^^; ところで、コードをみて不思議だなと思ったんですが、なんでmy_scatterを引数なしで呼び出してエラーが出てないんでしょうか? x, yを指定してないのにグラフが出力されてる流れがいまいち分からないので、解説して欲しいです!
magichan

2020/04/24 00:19 編集

PairGrid.map_offdiag() は非対角線のグラフを描画するための「関数を登録する」ためのAPIとなります。よって map.offdiag() の引数は「関数名」となりますので引数はありません。 ですので、 g.map_offdiag(my_scatter) はここで、my_scatter() を実行しているわけではなく、単に関数の登録だけを行っておき、実際にグラフを描画するときに PairGrid 内部からこの my_scatter関数が20回ほど(引数付きで)呼ばれるという動作となります。
morin

2020/04/24 00:50

関数名だけ引数として渡すときもあるんですね、、。初めて知りました 回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問