1. seabornの軸ラベル

seabornでグラフを作成したときに軸ラベルを加工したいことがあります。

  1. ラベルが長すぎて隣と重なってしまった

  2. 数値ラベルをカンマ区切りにフォーマットしたい

  3. 数値ラベルに単位を追加したい

しかしplotのオブジェクトの構成は複雑怪奇、設定項目も多すぎてとても把握しきれません。

今回はせめて軸ラベルだけでも少しでも自在に扱えるようになることを目指して試した結果を共有します。

2. Figure level, Axes level

seabornでは関数を2つに分類できます。

  1. Figure level functions

  2. Axes level functions

今回は個人的な好みでFigure level functionsを使用します。

2.1. オブジェクトの階層構造

seabornのFigure level functionsではFacetGridオブジェクトが返されます。

各オブジェクトは階層構造のような構成になっています

  • FacetGrid

    • Figure

      • AxesSubplot

AxesSubplotは複数持つことが可能です。

軸ラベルを取得するにはAxesSubplotのメソッドを使用します。

ちなみにAxes level functionsで返されるオブジェクトはAxesSubplotですので軸ラベルの取得方法は共通です。

3. 軸ラベルを取得、設定するメソッド

matplotlibのメソッドを使用します。

x軸ラベルのものを紹介しますがy軸の場合にはxをyに変更するだけです。

3.1. x軸ラベルを取得するメソッド

x軸ラベルを取得するメソッドはget_xticklabelsです。

3.2. x軸ラベルを設定するメソッド

x軸ラベルを取得するメソッドはset_xticklabelsです。

4. 実装、コード

実際に試してみます。

4.1. データとプロットの準備

tipsデータを使用します

time別にtotal_bill×tipの散布図を作成します。

example.py
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

tips = sns.load_dataset('tips')

grid = sns.relplot(
    x="total_bill",
    y="tip",
    col="time",
    data=tips
)
grid.savefig('grid.png')
grid.png
grid

4.2. オブジェクト型の確認

オブジェクト型を確認します。

example.py
print(grid)
output
<seaborn.axisgrid.FacetGrid object at 0x7f4469a62d90>

FacetGridです。

4.3. Figureの取得

Figureを取得します。

example.py
grid.fig
output
<Figure size 1000x500 with 2 Axes>

Figureオブジェクトを取得できました。2つのAxesが存在することも確認できます。

4.4. AxesSubplotの取得

AxesSubplotを取得します。

example.py
grid.fig.axes
output
[<AxesSubplot:title={'center':'time = Lunch'}, xlabel='total_bill', ylabel='tip'>,
 <AxesSubplot:title={'center':'time = Dinner'}, xlabel='total_bill'>]

AxesSubplotをリスト型で取得できました。

4.5. x軸ラベルのTextオブジェクトを取得する

上記で取得したのはリスト型なので0番目の要素のAxesSubplotを使用してx軸ラベルのTextオブジェクトを取得します。

example.py
grid.fig.axes[0].get_xticklabels()
output
[Text(0.0, 0, '0'),
 Text(10.0, 0, '10'),
 Text(20.0, 0, '20'),
 Text(30.0, 0, '30'),
 Text(40.0, 0, '40'),
 Text(50.0, 0, '50'),
 Text(60.0, 0, '60')]

Textオブジェクトをリスト型で取得できました。

4.6. Textオブジェクトから軸ラベルを取得する

get_textを使用して軸ラベルを取得します。

上記で取得したTextオブジェクトはリスト型なのでリスト内包表記を使用して軸ラベルを取得します。

xlabels=[ t.get_text() for t in ( grid .fig .axes[0] .get_xticklabels() ) ]

example.py
xlabels=[
    t.get_text()
    for t
    in
    (
        grid
        .fig
        .axes[0]
        .get_xticklabels()
    )
]
print(xlabels)
output
['0', '10', '20', '30', '40', '50', '60']

これでx軸ラベルを取得できました。

結構大変です。

4.7. ラベルの加工

実験のためラベルを一部加工します。

今回は単位’yen’を追加してみます。

example.py
xlabels_replace=[
    s+'yen'
    for s in xlabels
]
print(xlabels_replace)
output
['0yen', '10yen', '20yen', '30yen', '40yen', '50yen', '60yen']

4.8. x軸ラベルの設定

x軸ラベルを設定します。

今回、AxesSubplotが2つあるのでfor文でそれぞれに設定します。

example.py
for axe in grid.fig.axes:
    axe.set_xticklabels(
        xlabels_replace,
    )
grid.savefig('grid_replace.png')
grid_replace.png
grid replace

x軸ラベルを設定できています。

5. まとめ

FacetGridのx軸ラベルを取得し加工して設定してみました。

階層構造やリスト構造など複雑でしたが、自分自身の手を動かしながら試したことで少しだけプロットのオブジェクトの理解が進んだような気がします。

今後は軸ラベルの設定はなんとかなりそうです。

今回は以上です。