複数のカテゴリをFacet内でひとまとめにする
Pythonのグラフ描画ライブラリseabornのメソッドrelplot()
の引数col
やraw
は
異なるカテゴリのプロットを表形式でまとめるられるのですが、
カテゴリ数 = Facet数が増えると幅が長くなりすぎるという問題があります。
その対策として、この記事では画像の右の列のように
1つのFacet内に複数カテゴリのプロットを実現する方法を紹介します。
普通にやってみる
例として有名なirisデータセットをプロットしてみます。
col
hue
ともに species を選択すると以下の画像のようになります。
(この場合はhueで色分けする意味があまりないですが…)
import seaborn as sns
df = sns.load_dataset('iris') # speciesは3種類
sns.relplot(
data=df,
x='sepal_length',
y='sepal_width',
col='species',
hue='species'
)
カテゴリ(色)をまとめるための列を作成
本題に入ります。
speciesの違いは色分けすればわかるので
versicolorとvirginicaをひとまとめにすることを考えます。
そのために、df内に新しい列col_facet
を置換辞書から生成しましょう。
するとcol_facet
に対応するspiecesがすべて1つのFacet内にプロットされるようになります。
なおFacetの順番はcol_order
で設定できます。
# replace()でspecies列を L または R に置換した列を新規に作成
df['col_facet'] = df['species'].replace(
{
'setosa': 'L',
'versicolor': 'R',
'virginica': 'R'
}
)
sns.relplot(
data=df,
x='sepal_length',
y='sepal_width',
col='col_facet', #列を変更
col_order=['L', 'R'], #新規に指定
hue='species'
)
うまくいっています。
余談ですが、まとめた後のFacet数も数がある場合は
置換辞書d
の置換先に0以上の整数を指定して
sns.relplot(
col_order=list(range(max(d.values()))
) #他の引数は省略
などとするとよいでしょう。
表題を削除
col_facet
でまとめたカテゴリに特段の意味がない場合には
col_facet = Lのような表題は必要ないと思います。
表題を一様に削除するには、
relplot()の戻り値であるFacetGrid
のメソッドset_titles()
を以下のように設定します。
g = sns.relplot(
data=df,
x='sepal_length',
y='sepal_width',
col='col_facet',
col_order=['L', 'R'],
hue='species'
)
# 全タイトルを空文字列に設定
g.set_titles(col_template='')
これで表題を消すことができました。
参考