[解決済み] matplotlib を使って、カテゴリレベルの違いに応じて異なる色をプロットする
質問
次のようなデータフレームがあります。
diamonds
のような変数で構成されています。
(carat, price, color)
の散布図を描きたい。
price
を
carat
に対して、各
color
を意味し、異なる
color
は異なる色で描画されることを意味します。
で簡単です。
R
で
ggplot
:
ggplot(aes(x=carat, y=price, color=color), #by setting color=color, ggplot automatically draw in different colors
data=diamonds) + geom_point(stat='summary', fun.y=median)
<イグ
これをPythonでやるにはどうしたらいいのでしょうか。
matplotlib
?
PS:
などの補助的なプロッティングパッケージについて知っています。
seaborn
や
ggplot for python
を使って仕事をすることが可能かどうかを調べたいだけです。
matplotlib
を単独で使用することが可能かどうかを知りたいだけです。
どのように解決するのですか?
インポートとサンプルDataFrame
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns # for sample data
from matplotlib.lines import Line2D # for legend handle
# DataFrame used for all options
df = sns.load_dataset('diamonds')
carat cut color clarity depth table price x y z
0 0.23 Ideal E SI2 61.5 55.0 326 3.95 3.98 2.43
1 0.21 Premium E SI1 59.8 61.0 326 3.89 3.84 2.31
2 0.23 Good E VS1 56.9 65.0 327 4.05 4.07 2.31
と
matplotlib
を渡すことができます。
plt.scatter
a
c
引数で、色を選択することができます。次のコードでは
colors
辞書を定義し、ダイヤモンドの色をプロットの色に対応させています。
fig, ax = plt.subplots(figsize=(6, 6))
colors = {'D':'tab:blue', 'E':'tab:orange', 'F':'tab:green', 'G':'tab:red', 'H':'tab:purple', 'I':'tab:brown', 'J':'tab:pink'}
ax.scatter(df['carat'], df['price'], c=df['color'].map(colors))
# add a legend
handles = [Line2D([0], [0], marker='o', color='w', markerfacecolor=v, label=k, markersize=8) for k, v in colors.items()]
ax.legend(title='color', handles=handles, bbox_to_anchor=(1.05, 1), loc='upper left')
plt.show()
df['color'].map(colors)
は、"diamond" から "plotting" へと色を効果的にマッピングします。
(もう 1 つのサンプル画像を載せないことをお許しください。2 つで十分だと思います :P)
と
seaborn
を使うことができます。
seaborn
のラッパーである
matplotlib
のラッパーで、デフォルトでよりきれいに見えるようにし(むしろ意見に基づくものですが:P)、いくつかのプロット機能も追加しています。
このために、あなたは
seaborn.lmplot
で
fit_reg=False
を追加します (これにより、自動的に何らかの回帰が行われるのを防ぐことができます)。
-
sns.scatterplot(x='carat', y='price', data=df, hue='color', ec=None)
も同じことをします。
選択する
hue='color'
を選ぶと、seaborn はデータを分割して
'color'
カラムのユニークな値に基づいてデータを分割し、プロットするように指示します。
sns.lmplot(x='carat', y='price', data=df, hue='color', fit_reg=False)
と
pandas.DataFrame.groupby
&
pandas.DataFrame.plot
seabornを使いたくない場合は
pandas.groupby
を使って色だけを取得し、matplotlibだけを使ってプロットします。ただし、手動で色を割り当てながら行う必要があります。以下に例を追加しました。
fig, ax = plt.subplots(figsize=(6, 6))
grouped = df.groupby('color')
for key, group in grouped:
group.plot(ax=ax, kind='scatter', x='carat', y='price', label=key, color=colors[key])
plt.show()
このコードは、上記と同じDataFrameを想定し、グループ化するために
color
. そして、これらのグループを繰り返し、それぞれについてプロットしています。色を選択するために、私は
colors
辞書を作成し、ダイヤモンドの色(例えば
D
) を実際の色 (例えば
tab:blue
).
関連
-
[解決済み] matplotlib でプロットをクリアするために cla()、clf() または close() をいつ使うか?
-
[解決済み] Matplotlibでプロットを表示するのではなく、画像ファイルに保存する。
-
[解決済み] IPythonノートブックmatplotlibプロットをインラインで行う方法
-
[解決済み】forループを使った辞書の反復処理
-
[解決済み] matplotlib のプロットでフォントサイズを変更する方法
-
[解決済み] SQLAlchemy: セッションの作成と再利用
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] スペースがないテキストを単語のリストに分割する方法
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
-
[解決済み] Pythonの文字列書式をリストで使う
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 前月の日時オブジェクトを返す
-
[解決済み] 小数点以下1桁を取得する[重複]。
-
[解決済み] SQLAlchemy - テーブルのリストを取得する
-
[解決済み] Django 1.7で初期マイグレーションからマイグレートバックする方法は?
-
[解決済み] オブジェクトのリストに特定の属性値を持つオブジェクトが含まれているかどうかをチェックする
-
[解決済み] CSVデータを処理する際、1行目のデータを無視する方法を教えてください。
-
[解決済み] pycharmがタブをスペースに自動変換する
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法
-
[解決済み] Pythonでランダムなファイル名を生成する最良の方法
-
[解決済み] Alembicアップグレードスクリプトでインサートやアップデートを実行するにはどうすればよいですか?