matplotlibで複数列のプロットをいい感じに
目次
こんなこと書く
- matplotlibで複数列のプロットを作りたい。
- でも、xラベルとタイトルがかぶって困る。
解決策
概要
例えば、こんなプロットを作りたいとしましょう。左側が正規分布のサンプル、右側がラプラス分布のサンプル。列ごとに平均が異なっています。
見ての通り、xラベルとタイトルがかぶってしまって汚い状態です。これを綺麗にするにはどうすればいいでしょうか?

結論から言うと、subplots_adjustを使うだけでOKです。こんな感じになります。

ただ、ちょっと考え方が難しかったのが、「どこでsubplots_adjustを使えばいいのか?」ということ。
ぼくはpandas.DataFrame.plot()を呼び出してプロットしているので、subplots_adjustの呼び出し位置がよくわからなかったんですよ。
結論的には「プロットがすべて終わった後にsubplots_adjustを呼び出す」が正解でした。イメージ的には、プロットモジュールに直接「行間をあけるように」と命令する感じです。
matplotlibではpltモジュールに命令することがよくあるイメージ。オブジェクト思考をしていると、axesオブジェクトをいじるのでは?と思ってしまいがちですね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import matplotlib.pyplot as plt import pandas import numpy fig, axes = plt.subplots(nrows=5, ncols=2, figsize=(15, 15)) for i, mu in enumerate(range(0, 5)): data_x = numpy.random.normal(mu, 1, size=(30,)) data_y = numpy.random.laplace(mu, 1, size=(30,)) df_data = pandas.DataFrame({'x': data_x, 'y': data_y}) df_data['x'].plot.bar(ax=axes[i, 0], xlabel='samples', title=f'N(mu={mu}, sigma^2=1)') df_data['y'].plot.bar(ax=axes[i, 1], xlabel='samples', title=f'Laplace(mu={mu}, sigma^2=1)') # この命令を最後に書く plt.subplots_adjust(hspace=1.0) |
ディスカッション
コメント一覧
まだ、コメントがありません