jupyter notebookでグラフを描く際のファーストチョイスであるmatplotlibについてメモしておく. The Python Graph Libraryというウェブサイトがあり,どういうグラフをどういうコードで書くと良いかということがまとめられたサイトがあるので,参考にすると良い.
以下に書いてあることはjupyter notebookを用いて,以下のようなプリアンブルがあることを前提としている.
% matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
sns.set_theme(context='talk',style='ticks')
%matplotlib inline
:notebookの中にグラフを表示させる- matplotlibのデフォルトではちょっと見栄えが良くないので,
seaborn
を利用する seaborn
では,context
としてtalk
かposter
が(フォントサイズなどが)ちょうどよいと思う
簡単にプロットする
x = np.linspace(0,100,50) # [0,100]の範囲の50点の数値の配列
y = sin(x)
plt.plot(x,y)
plt.show()
エラーバーありでプロット
plt.errorbar(x,y,yerr=yerrors,fmt='bo',ecolor='b')
対数プロット
plt.xscale('log')
plt.yscale('log')
ラベルの設定
plt.xlabel('X, $\sigma$', fontsize=16, fontname='serif')
plt.ylabel('Energy (eV)', fontsize=16, fontname='serif')
- 上記のようにして,LaTeX形式の数式を利用できる.
- フォントサイズやフォントを指定できる.
目盛りの設定
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
目盛りを文字列にする
names = ['A','B','C',...]
x = [ i for i in range(len(names))]
...
plt.xticks(x,names)
目盛りを傾かせる
plt.xticks(x,names,fontsize=14,rotation=60,
horizontalalignment="right")
rotation
で傾く角度を指定horizontalalignment
で文字列のどこを目盛りに合わせるかの指定
上と右の目盛り線を消す
fig, ax = plt.subplots(figsize=(8,5))
ax.plot(x,y)
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
plt.show()
上記のように書くことで下図のように,左と下だけに線が描かれた図とすることができる.
タイトルの表示
plt.title('TITLE')
レジェンド(凡例)の表示
plt.plot(x,y,label='sin(x)')
..
plt.legend(loc='best')
のように,label='label name'
を指定しておいて,plt.legend()
を呼べばレジェンド(凡例)が表示される.
loc='best'
のように場所を指定する.best
の場合にはmatplotlibが良きにはからってくれる.
レジェンドを図の外に表示
plt.legend(loc='upper left', bbox_to_anchor=(1,1))
このようにすると,図の右外にレジェンドが表示される.
ポイントの整形
markeredgecolor
もしくはmec
でポイントの色を,markeredgewidth
もしくはmew
でポイントのエッジの幅を指定できる.
以下のように,plot()
にオプションとしてつける.
plt.plot(x,y,'o',mec='white',mew=1.0)
ポイントサイズはmakersize
もしくはms
.
サイズ
width=10
height=10
plt.figure(figsize=(width,height))
このwidth
とheight
の単位がインチというところがなんともアメリカらしく,意味わからん.
y=0のライン
plt.axhline(y=0,color='black',linestyle='--')
出力
plt.show()
plt.savefig("graph.png", format='png', dpi=300, bbox_inches='tight')
plt.show()
で画面出力plt.savefig(...)
でファイルに出力可能.dpi=300
くらいにしておかないと画質がわるくなるみたい.bbox_inches='tight'
としないと,ラベルなんかが見切れて出力されることがある.
このbbox_inches='tight'
と同じことを,
plt.tight_layout()
のようにしても実現できる.
Seabornのcolor paletteでカラーの確認
matplotlibのcolor mapというものに相当するものとして,seabornにcolor paletteというのがある.これはさまざまな色の組み合わせのセットが与えられているもの.その中にcubehelix
というcolor paletteがあるが,これは色相(hue)と色の濃さ(brightness?)を段階的に変えていくもの.以下のようなコードをJupyter notebookで表示すると,インタラクティブにどのようなpaletteになるかを確認することができる.
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
from ipywidgets import interact, FloatSlider
sns.set(context='poster',style='ticks')
def show_pal2(start, rot, dark, light):
sns.palplot(sns.cubehelix_palette(8, start=start, dark=dark, light=light, rot=rot,reverse=True))
interact(show_pal2, start=FloatSlider(max=3), rot=FloatSlider(0.4, max=3.1415),
dark=FloatSlider(0.0,max=1), light=FloatSlider(1.0,max=1))
jupyter lab上でインタラクティブに操作する
ipympl というライブラリを利用すると,グラフサイズや表示範囲なんかをインタラクティブに変更することができるようになる.
$ pip install ipympl
としてライブラリをインストール. jupyter labのバージョンが3以上であれば,これ以上は不要.3未満の場合はextensionの設定なんかが必要なので,ipymplのHPなんかを参考にして設定する.
jupyter notebook (lab) の最初に,
%matplotlib widget
と書くことで,あとは普通にmatplotlibの描画を行うと,そのグラフがインタラクティブに操作できるようになる.