見出し画像

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

オブジェクト指向な書き方(その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

オブジェクト指向な書き方(その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()

画像3

スタイルを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()

画像4

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

画像5

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

スクリーンショット 2020-05-12 10.46.33

図の外に注釈をつける

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

スクリーンショット 2020-10-13 12.12.47

目盛り(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)) 

画像6

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

画像7

論文データ用スタイル(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()

画像8

凡例の場所指定: 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)

画像9

凡例をグラフ外へ: 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)
#  ↑コレ

画像10

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)

画像11

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

画像12

目盛線のみ出てくるのが気持ち悪いので消す: 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)

画像13

画像の保存 (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);

画像14

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

スクリーンショット 2020-09-07 17.19.14

使用できる色

Matplotlibのサイトより

個人的にはblueよりもsteelblue
redよりもsaddlebrownが好き

画像17

その他諸々

・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で忘れがちな文法まとめ

以上これで大体のグラフ描画は大丈夫なはず。


この記事が気に入ったらサポートをしてみませんか?