RuntaScience diary

気象系データを扱う学生 旅が好きです

Welcome to my blog

About

Python matplotlibのGridspecーグラフの柔軟な分割(3:1でもで4:1でも)

こんにちは。

 

グラフの分割をすると思うのですが、普通に分割すると1:1とか一つ一つが同じ大きさのグラフになりますよね。

そこで今回はMatplotlibのGridspecを用いて、3:1やさらに複雑なグラフの分割をしていきたいと思います!

 

★事前に必要な知識

グラフの基本的な書き方(matplotlib)

リストのスライス

 

 

 

基礎

まずは今回使うGridspecをインポートしましょう・

 

import matplotlib.pyplot as plt
from matplotlib import gridspec

 

 

例1

 縦方向に3:1で分割してみます

 

fig = plt.figure(figsize=(4,3))
#分割 *1 ncols=2 nrows=1 gs = gridspec.GridSpec(ncols, nrows, height_ratios=(3, 1)) ax1 = fig.add_subplot(gs[:1, 0]) ax2 = fig.add_subplot(gs[-1, 0]) ax1.text(0.5,0.5, "ax1", fontsize=30, horizontalalignment='center', verticalalignment='center',) ax2.text(0.5,0.5, "ax2", fontsize=30, horizontalalignment='center', verticalalignment='center',) #グラフ間の隙間 plt.subplots_adjust(hspace=0.25) fig.savefig("XXX.png", format='png', dpi=330)

f:id:RuntaScience:20200616162419p:plain

Key
 1) gridspec.GridSpec(縦方向分割数, 横方向分割数, height_ratios=(3, 1))

 height_ratioはその比率です。

 

例2

 横方向に1:3で分割してみます

 

fig = plt.figure(figsize=(4,3))
ncols=1
nrows=2
gs = gridspec.GridSpec(ncols, nrows, width_ratios=(1,3)) #*1
ax1 =  fig.add_subplot(gs[0, 0])
ax2 =  fig.add_subplot(gs[0, 1:])

ax1.text(0.5,0.5, "ax1", fontsize=30,
        horizontalalignment='center',
        verticalalignment='center',)
ax2.text(0.5,0.5, "ax2", fontsize=30,
        horizontalalignment='center',
        verticalalignment='center',)

#グラフ間の隙間
plt.subplots_adjust(wspace=0.25)

fig.savefig("XXX.png", format='png', dpi=330)

 

 

f:id:RuntaScience:20200616162414p:plain

Key
 1) gridspec.GridSpec(縦方向分割数, 横方向分割数, width_ratios=(1, 3))

 width_ratioはその比率です。

 

応用

さらに柔軟にグラフを描いてみましょう

例3

 縦方向に1:3で、横方向に3:1に分割してみましょう

 

fig = plt.figure(figsize=(6, 6))
ncols=2
nrows=2
gs = gridspec.GridSpec(ncols, nrows, height_ratios=(1, 3), width_ratios=(3, 1))
ax1 =  fig.add_subplot(gs[:1, :1])
ax2 =  fig.add_subplot(gs[-1, :1])
ax3 =  fig.add_subplot(gs[:1, -1])
ax4 =  fig.add_subplot(gs[-1, -1])

ax1.text(0.5,0.5, "ax1", fontsize=30,
        horizontalalignment='center',
        verticalalignment='center',)
ax2.text(0.5,0.5, "ax2", fontsize=30,
        horizontalalignment='center',
        verticalalignment='center',)
ax3.text(0.5,0.5, "ax3", fontsize=30,
        horizontalalignment='center',
        verticalalignment='center',)
ax4.text(0.5,0.5, "ax4", fontsize=30,
        horizontalalignment='center',
        verticalalignment='center',)

#グラフ間の隙間
plt.subplots_adjust(hspace = 0.20, wspace=0.25)

fig.savefig("XXX.png", format='png', dpi=330)

 

 

f:id:RuntaScience:20200616162436p:plain

 

例4

 次は比をばらばらにして分割してみましょう

 

fig = plt.figure(figsize=(6, 6))
ncols=3
nrows=2
gs = gridspec.GridSpec(ncols, nrows, height_ratios=(1, 1, 1), width_ratios=(3, 1))
ax1 =  fig.add_subplot(gs[:2, :1])
ax2 =  fig.add_subplot(gs[-1, :1])
ax3 =  fig.add_subplot(gs[:1, -1])
ax4 =  fig.add_subplot(gs[1:, -1])

ax1.text(0.5,0.5, "ax1", fontsize=30,
        horizontalalignment='center',
        verticalalignment='center',)
ax2.text(0.5,0.5, "ax2", fontsize=30,
        horizontalalignment='center',
        verticalalignment='center',)
ax3.text(0.5,0.5, "ax3", fontsize=30,
        horizontalalignment='center',
        verticalalignment='center',)
ax4.text(0.5,0.5, "ax4", fontsize=30,
        horizontalalignment='center',
        verticalalignment='center',)

#グラフ間の隙間
plt.subplots_adjust(hspace = 0.3,wspace=0.25)

fig.savefig("XXX.png", format='png', dpi=330)

 

 

f:id:RuntaScience:20200616162424p:plain

 

例5

 さらに細かく変形してみましょう

fig = plt.figure(figsize=(6, 6))
ncols=3
nrows=3
gs = gridspec.GridSpec(ncols, nrows, height_ratios=(1, 1, 1), width_ratios=(2, 2, 1))
ax1 =  fig.add_subplot(gs[:2, :2])
ax2 =  fig.add_subplot(gs[-1, :1])
ax3 =  fig.add_subplot(gs[-1, 1:2])
ax4 =  fig.add_subplot(gs[:1, -1])
ax5 =  fig.add_subplot(gs[1:, -1])

ax1.text(0.5,0.5, "ax1", fontsize=30,
        horizontalalignment='center',
        verticalalignment='center',)
ax2.text(0.5,0.5, "ax2", fontsize=30,
        horizontalalignment='center',
        verticalalignment='center',)
ax3.text(0.5,0.5, "ax3", fontsize=30,
        horizontalalignment='center',
        verticalalignment='center',)
ax4.text(0.5,0.5, "ax4", fontsize=30,
        horizontalalignment='center',
        verticalalignment='center',)
ax5.text(0.5,0.5, "ax5", fontsize=30,
        horizontalalignment='center',
        verticalalignment='center',)


#グラフ間の隙間
plt.subplots_adjust(hspace = 0.3, wspace=0.4)

fig.savefig("XXX.png", format='png', dpi=330)

 

f:id:RuntaScience:20200616162430p:plain

 いかがだったでしょうか。

Grodspecを用いると、柔軟にグラフを分割することが可能です。

是非試してみてください!

 

それでは🌏