見出し画像

【matplotlib】自在に可視化メモ

毎度毎度matplotlibについて調べるのが嫌になって発狂寸前だったので走り書き程度の備忘録としてまとめます。この記事の正確性は知りません。

なお、なるべく無駄なものは排除して必要な情報が目に留まりやすくしているので軸ラベルやグラフのタイトルなどは省略しています。「軸ラベルなくてグラフの意味あるの?ナメてるの?」などのツッコミはご容赦ください。

1.インストール

pip install matplotlib
pip install japanize-matplotlib

通常のmatplotlibのインストールと日本語表示を簡単にしてくれるjapanize-matplotlibをインストール。
japanize-matplotlibはフォントが「IPAexゴシックフォント」で固定される。

2.「.pyplot」について

import matplotlib.pyplot as plt

の「.pyplot」はmatplotlibの中のAPIの一つ。
この中にplot()やshow()などが用意されている。
APIには他にanimationやfont_managerなどが存在する。

3.メリット(エクセルと比較)

・データをすべて用意しなくてもいい。(エクセルだと全ての値を取得する必要があるがpltだと数式等で表せて便利)
・ウェブからデータをとってこれる。
などのメリットがあるが筆者の意見では「一度覚えてしまえば自由自在にグラフを出力できる。」という点。

4.plt.plotとax.plotの違い

躓きがちなpltとaxについての違い

5.figクラスとaxクラスの宣言

・fig ... figureクラス。図をファイルへの保存をする際の単位(という解釈をしておく。)
・ax ... axクラス。表示する図単位(という解釈をしておく。)

パターン1:シンプル

plt.figure(figsize=(7,4))
plt.plot(hoge)

シンプル

パターン2:一括で宣言

fig, ax = plt.subplots(2,2)
ax[0, 0].plot(x, y)
ax[1, 0].hist(y)
ax[0, 1].plot(x, y2)
ax[1, 1].hist(y2)

一括

パターン3:別々で宣言

fig = plt.figure(figsize=(7,4))
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
ax1.plot(hoge)

別々に宣言

これだとaxの数が多いとコードがかなり長くなるし一つ一つラベルなどの設定をしていくと面倒臭い…

パターン3:axの数が多い場合(個人的によく使う)

fig = plt.figure(figsize=(7,3))
N = len(y_list) # 2個
ax = []
for i in range(0, N):
   ax.append(fig.add_subplot(1,2,i+1))
   ax[-1].plot(x, y_list[i])

よく使う

データフレームのカラムすべてに対して可視化を行うときなどに有効。
だいぶコードがすっきりする。

6.背景色について

背景色を設定することできれいに見えたり見えなかったりする。

figの背景色

fig = plt.figure(figsize=(7,4), facecolor='#b0e0e6')
plt.plot(x,y)

figのみ

figの背景色を変えて普通にsavefigをしたら設定したはずの背景色が反映されません。上の図は画面をキャプチャしています。
fig背景を変えた画像保存の方法については後述します。

axの背景色

fig = plt.figure(figsize=(7, 4))
ax = fig.add_subplot(1, 1, 1, fc='#b0e0e6')
ax.plot(x, y)

axのみ

7.ax同士の間隔調整

fig, ax = plt.subplots(2, 2)
ax[0, 0].plot(x, y)
ax[0, 1].hist(y)
ax[1, 0].plot(x, y2)
ax[1, 1].hist(y2)
ax[0, 0].set_xticklabels('')
ax[0, 1].set_xticklabels('')
ax[0, 0].set_title('波')
ax[0, 1].set_title('分布')
plt.subplots_adjust(wspace=0.2, hspace=0)

画像7

x軸ラベルが同じで同種類の図などは上の様に引っ付けてしまっても見やすいですね。

8.軸ラベルをカンマ区切りにする。

ax.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, loc: "{:,}".format(int(x))))
ax.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, loc: "{:,}".format(int(x))))

カンマ区切り

9.凡例の設定

普通の凡例

fig = plt.figure(figsize=(7,4))
ax = fig.add_subplot(1,1,1)
ax.plot(x, y, label='sin')
ax.plot(x, y2, label='cos')
ax.legend()

普通の凡例

普通に凡例を設定するとこうなります。
いろいろいじれるのでメモメモ。←特に何回も調べている項目

設定項目
loc:後述
bbox_to_anchor:後述
ncol:凡例の列数,int
frameon:凡例の枠線の有無,True/False
fancybox:角を丸めるか,True/False
framealpha:凡例の透明度
facecolor:凡例の色
mode='expand':凡例の幅をaxの幅に合わせる
title:凡例のタイトル
borderpad:凡例の枠とラベルのスペース
labelspacing:ラベル間の距離
handlelength:ハンドルの長さ
handletextpad:ハンドルとラベルの間のスペース
columnspacing:2列以上の場合の列間の距離

パターン1:locのみ

ax.legend(loc=(0.1, 0.1))

※locは整数の組or文字列での設定が可能
※"upper left","upper right","lower left","lower right","center left","center right","upper center","lower center","center","best","right"

パターン2:loc, bbox_to_anchorで指定

ax.legend(loc=(0.1, 0.1), bbox_to_anchor=(1, 1))

※locで凡例内の基準点を指定、bbox_to_anchorで指定したax内の位置に基準点を合わせる。
※locは整数の組or文字列での設定が可能
※"upper left","upper right","lower left","lower right","center left","center right","upper center","lower center","center","best","right"

10.figの画像保存について

タイトな保存

plt.savefig(path, bbox_inches='tight')

全ての背景を透明で保存

plt.savefig(path, transparent=True)

※fig背景もax背景も透明で保存される。

fig背景のみ透明

fig.patch.set_alpha(0)
plt.savefig(path)

11.デフォルト設定のオーバーライド

plt.rcParams['パラメータ'] = (値)

自分がよく利用する設定を別ファイルに持っておき毎回読みだして自動設定するのがよい。

参考URL

https://qiita.com/ceptree/items/f52fab12bc07753f8909
https://astropengu.in/posts/26/
https://qiita.com/aurueps/items/d04a3bb127e2d6e6c21b

この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

3
機械学習やデータサイエンスについて勉強したことをまとめて行こうかなぁと思いまして。 毎回同じ内容を調べているような気がした&どこからでもアクセスできる場所に知識を保存したいと思いnoteに備忘録として残します。自分用なので情報の精度、体裁などは一切保証しませんので悪しからず。

この記事が入っているマガジン

可視化シリーズ
可視化シリーズ
  • 1本

pythonによる可視化のメモ

コメントを投稿するには、 ログイン または 会員登録 をする必要があります。