先日、matplotlibで作った少し手の込んだグラフを、x軸とy軸を反転したくなることがありました。
少々手こずったのでその時調べた内容をまとめておきます。
matplotlibでは、グラフの種類によってx軸y軸の反転方法が異なります。
大きく分けて次の3パターンがあるようです。
1. x座標とy座標の引数の順番を入れ替えるだけ。
2. x軸とy軸を反転させたバージョンの別のメソッドが用意されている。
3. グラフを書くときに引数で向き(orientation)を指定する。
また、物によっては反転させることができないものもあるようです。
具体的に一つやってみます。
まずデータの準備です。
# 必要ライブラリのインポートとデータ生成
import matplotlib.pyplot as plt
from scipy.stats import beta
import numpy as np
beta_fz = beta(a=3, b=2)
data = beta_fz.rvs(100)
# 真の期待値
x_mean = beta_fz.stats("m")
そして、ここで生成したデータを元に、以下のグラフと、そのxy軸反転版を書いてみました。
– データのヒストグラム
– 元の分布の確率密度関数
– 元の分布の期待値の位置を表す線
– 元の分布のデータの70%のデータが含まれる区間の塗り潰し
x = np.linspace(0, 1, 101)
x_clip = np.linspace(beta_fz.ppf(0.15), beta_fz.ppf(0.85), 101)
fig = plt.figure(figsize=(12, 6), facecolor="w")
ax = fig.add_subplot(1, 2, 1, title="元のグラフ")
ax.hist(data, density=True, alpha=0.3)
ax.plot(x, beta_fz.pdf(x))
ax.fill_between(x_clip, beta_fz.pdf(x_clip), alpha=0.3, color="orange")
ax.vlines(x_mean, ymin=0, ymax=beta_fz.pdf(x_mean))
ax = fig.add_subplot(1, 2, 2, title="x軸y軸反転したグラフ")
# ヒストグラムは orientation="horizontal" を指定する
ax.hist(data, density=True, orientation="horizontal", alpha=0.3)
# plot は渡す引数の順番を入れ替えるだけ
ax.plot(beta_fz.pdf(x), x)
# fill_between に対しては、 fill_betweenx メソッドが用意されている
ax.fill_betweenx(x_clip, beta_fz.pdf(x_clip), alpha=0.3, color="orange")
# vlines に対しては、 hlines メソッドが用意されている
ax.hlines(x_mean, xmin=0, xmax=beta_fz.pdf(x_mean))
plt.show()
出力されたグラフが次です。
x軸とy軸が入れ替わりました。 コードをみていただくとそれぞれ反転方法が異なっていることがわかると思います。
x座標とy座標の引数の順番を入れ替えるだけのパターンには、
ax.plot(折れ線グラフ)やax.scatter(散布図)があります。
x軸とy軸を反転させたバージョンの別のメソッドが用意されているパターンには、
棒グラフであれば、ax.bar と ax.barh、
エリアの塗りつぶしであれば、ax.fill_between と ax.fill_betweenx、
縦線であれば、 ax.vlines と ax.hlines
などの組み合わせがあります。
ドキュメントのこちらのページで似てる名前のメソッドを探すと良いでしょう。
グラフを書くときに引数で向き(orientation)を指定するパターンは、
だいたい、ヒストグラム ax.hist だけと考えても良さそうです。
これはそれぞれのメソッドのドキュメントを読めば判断することができます。
(もしかしたら他にもあるかもしれませんが。)
一部のグラフには反転方法がわからないものもありましたが、実用上困ることはなさそうです。