![見出し画像](https://assets.st-note.com/production/uploads/images/11564749/rectangle_large_type_2_ed348642dc9db8c8b7e97d27b33e79b9.png?width=1200)
Matplotlib(Seaborn)の基本的な使い方
最近,研究活動(おもに実験)で得たデータを計算したり,可視化するのに使っているPython。 可視化(グラフ作成)に使うMatplotlib(Seaborn)の使い方をすぐ忘れてしまうので,自分のために書き留めておこうと思う。
ごく基本的な使い方
モジュールのインポート
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
データ準備
x = np.linspace(1,100,100)
y = x**2
一番簡単なプロット方法
plt.plot(x,y, label = 'y = x^2')
plt.legend()
オブジェクト指向な書き方(その1:figとaxを別々に指定)
figureを作り,次にその中のグラフの外枠(軸メモリなど)となるAxesを設定後,グラフを描画する方法。以下では,figとaxを別々に指定
fig =plt.figure (figsize = (10,5)) # figure をplt.figureで作成
ax = fig.add_subplot(1,1,1)
# ax を作成(subplotとし1行1列1番目と指定することで一つのグラフを作る)
ax.plot(x,y, label = 'y = x^2')
ax.legend() # labelの表示
オブジェクト指向な書き方(その2:figとaxを同時に指定)
figとaxをカンマで区切って,figsizeとともにplt.subplotsで指定する方法。上記(その1)と同じ図が描けるが,こちらの方が行数が上記の方法その1より少ないので良いかもしれない。
fig, ax = plt.subplots(figsize = (10,5))
ax.plot(x,y, label = 'y = x^2')
ax.legend() # labelの表示
ax.set()でx,y軸のラベルを表記
fig, ax = plt.subplots(figsize = (10,5))
ax.plot(x,y, label = 'y = x^2')
ax.set(xlabel ='x-axis',ylabel='y-axis' )
ax.legend()
スタイルをSeabornにする
sns.set()
sns.set() # コレ
fig, ax = plt.subplots(figsize = (10,5))
ax.plot(x,y, label = 'y = x^2')
ax.set(xlabel ='x-axis',ylabel='y-axis' )
ax.legend()
x軸とy軸の範囲を変える(半分の範囲にしてみる)
set( xlim =( , ), ylim = ( , ))
sns.set()
fig, ax = plt.subplots(figsize = (10,5))
ax.plot(x,y, label = 'y = x^2')
ax.set(xlabel ='x-axis', ylabel='y-axis', xlim=(0,50), ylim=(0,5000))
# 上記で x軸を0-50, y軸を0-5000の範囲に
ax.legend()
x軸目盛り(ticks)のラベルを指定した文字に変更
'set_xticks'と'ax.set_xticklabels'を用いて行なう
(例: 0-100をA-Fに変更する)
sns.set()
fig, ax = plt.subplots(figsize = (10,5))
ax.plot(x,y, label = 'y = x^2')
ax.set(xlabel ='x-axis',ylabel='y-axis' )
ax.set_xticks([0, 20, 40, 60,80, 100]) #まず,目盛り間隔を指定
ax.set_xticklabels(['A', 'B', 'C', 'D', 'E', 'F']) #次にラベルを指定
ax.legend()
図の外に注釈をつける
ax.annotate( 'annotation_word', (x, y), fontsize= nn , annotation_clip=False)とすることで可能
sns.set()
fig, ax = plt.subplots(figsize = (10,5))
ax.plot(x,y, label = 'y = x^2')
ax.set(xlabel ='x-axis',ylabel='y-axis' )
ax.set_xticks([0, 20, 40, 60,80, 100])
ax.set_xticklabels(['A', 'B', 'C', 'D', 'E', 'F'])
#注釈付け
ax.annotate("Alphabet Name",(-27, -1250), fontsize=15, annotation_clip=False)
ax.legend()
目盛り(ticks)の間隔を指定する
ax.xaxis.set_major_locator()を使って下記ではx軸の目盛を5ごとに打つように指定。
sns.set()
fig, ax = plt.subplots(figsize = (10,5))
ax.plot(x,y, label = 'y = x^2')
ax.set(xlabel ='x-axis',ylabel='y-axis')
ax.legend()
#以下でxーticksを5ごとに刻む
from matplotlib import ticker
ax.xaxis.set_major_locator(ticker.MultipleLocator(5))
X軸を対数表示にする
ax.set_xscale("log")
※ miner thicksを出力するためにstyleを'ticks'に指定
(y軸を変えるのは ax.set_yscale("log"))
sns.set()
sns.set_style('ticks')
fig, ax = plt.subplots(figsize = (10,5))
ax.plot(x,y, label = 'y = x^2')
ax.set_xscale("log") # ←ココ
ax.set(xlabel ='x-axis',ylabel='y-axis')
ax.legend()
論文データ用スタイル(despine:上と右の軸を除く)
sns.set_style('ticks')と右半分の軸を取るsns.despine()を使う。
spine=背骨だからdespine =”背骨を取る”って意味合いなのだろうか。
sns.set()
sns.set_style("ticks") # スタイルをticksに
fig, ax = plt.subplots(figsize = (10,5))
ax.plot(x,y, label = 'y = x^2')
sns.despine() # 半分軸を外す
ax.set(xlabel ='x-axis',ylabel='y-axis' )
ax.legend()
凡例の場所指定: ax.legend(loc = 'lower right')
凡例の枠を取る:ax.legend(frameon =False)
upper/rower right/left を指定。'best', 'center', 'right'も指定可能
(例)右下,枠なし: ax.legend('lower right, Frameon =False)
sns.set()
sns.set_style("ticks")
fig, ax = plt.subplots(figsize = (10,5))
ax.plot(x,y, label = 'y = x^2')
sns.despine()
ax.set(xlabel ='x-axis',ylabel='y-axis' )
ax.legend(loc='lower right', frameon = False)
凡例をグラフ外へ: ax.legend(bbox_to_anchor =())
sns.set()
sns.set_style("ticks")
fig, ax = plt.subplots(figsize = (10,5))
ax.plot(x,y, label = 'y = x^2')
sns.despine()
ax.set(xlabel ='x-axis',ylabel='y-axis' )
ax.legend(bbox_to_anchor=(1.0, 0.05), loc='lower left', borderaxespad=0)
# ↑コレ
bbox_to_anchor:凡例の枠の相対位置(アンカー)を指定。原点が(0, 0)右上は(1, 1)
loc:アンカーに, 凡例の枠のどの部分を合わせるか指定
(例)loc='upper left':アンカー枠左上, loc='center':アンカー枠の中心。
borderaxespad:アンカーとloc指定枠の距離を設定
破線加える vlines(), hlines()
sns.set()
sns.set_style("ticks")
fig, ax = plt.subplots(figsize = (10,5))
ax.plot(x,y, label = 'y = x^2')
sns.despine()
ax.set(xlabel ='x-axis',ylabel='y-axis' )
ax.vlines(x=100, ymax=0, ymin=10000, colors='k', linestyle='--',linewidths=1)
ax.hlines(y=10000, xmin=0, xmax=100, colors='k', linestyle='--',linewidths=1)
#垂直(vlines), 水平(hlines)
ax.legend(bbox_to_anchor=(0.8, 0.05), loc='lower left', borderaxespad=0)
xticks(目盛数値)の消去: set_xticklabels = ([])
yticksの場合は同様にset_yticklabels = ([])
sns.set()
sns.set_style('ticks')
fig, ax = plt.subplots(figsize = (10,5))
ax.plot(x,y, label = 'y = x^2')
sns.despine()
ax.set(xlabel ='x-axis',ylabel='y-axis')
ax.set_xticklabels([]) # コレ
ax.set_yticklabels([]) # コレ
ax.legend()
目盛線のみ出てくるのが気持ち悪いので消す: ax.tick_params()
ax.tick_params(axis = 'both' , length = 0 )としてtickの長さを0にする
sns.set()
sns.set_style('ticks')
fig, ax = plt.subplots(figsize = (10,5))
ax.plot(x,y, label = 'y = x^2')
sns.despine()
ax.set(xlabel ='x-axis',ylabel='y-axis')
ax.set_xticklabels([])
ax.set_yticklabels([])
ax.tick_params(axis = 'both', length = 0 ) #コレ
ax.legend(frameon = False)
画像の保存 (plt.savefig)
plt.savefig('filename.pdf', bbox_inches='tight')
# ファイルタイプは tiff, png, pdfなどが使用可能
" bbox_inches='tight' "をつけると収まりが良いみたい。。。
画像の保存: png fileで背景を透明に
"transparent = True" を加える
plt.savefig('filename.png', transparent = True, bbox_inches='tight')
x軸の数値(xticks)を90度回転:
labels = ax.get_xticklabels()
plt.setp(labels, rotation=90); # fontsizeも指定可能(fontsize = 10 など)
sns.set()
fig, ax = plt.subplots(figsize = (10,5))
ax.plot(x,y, label = 'y = x^2')
ax.set(xlabel ='x-axis',ylabel='y-axis' )
ax.legend()
#コレ
labels = ax.get_xticklabels()
plt.setp(labels, rotation=90);
x軸の数値(xticks)を45度回転(おすすめ):
ax.set_xticklabels(labels=x, rotation=45, ha='right') でもいける。ha = ' ' でラベル位置をleft, center, rightに調整できる
sns.set()
fig, ax = plt.subplots(figsize = (10,5))
ax.plot(x,y, label = 'y = x^2')
ax.set(xlabel ='x-axis',ylabel='y-axis' )
ax.legend()
#コレ
ax.set_xticklabels(labels=x, rotation=45, ha= 'center')
使用できる色
Matplotlibのサイトより
個人的にはblueよりもsteelblue
redよりもsaddlebrownが好き
その他諸々
・sns.set_context() で'paper', 'notebook', 'talk', 'poster'を選ぶことで,フォントサイズと線の太さが選べる(paperが最小,posterが最大)
(https://seaborn.pydata.org/generated/seaborn.set_context.html)
・sns.axes_style() でデフォルトのパラメータが確認可能
・変更は{}内で指定
sns.set_style("darkgrid", {"axes.facecolor": ".9"})
(https://seaborn.pydata.org/tutorial/aesthetics.html)
参考サイト
・matplotlib tutorial (結局ここをよく読むのが解決の近道かもしれない)
・matplotlib tutorial, The Lifecycle of a Plot
・matplotlib.axes
・早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話
・matplotlibで忘れがちな文法まとめ
以上これで大体のグラフ描画は大丈夫なはず。