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としてtalkposterが(フォントサイズなどが)ちょうどよいと思う

簡単にプロットする

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で文字列のどこを目盛りに合わせるかの指定

タイトルの表示

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))

このwidthheightの単位がインチというところがなんともアメリカらしく,意味わからん.

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の描画を行うと,そのグラフがインタラクティブに操作できるようになる.