【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)
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)
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)
例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)
例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)
いかがだったでしょうか。
Grodspecを用いると、柔軟にグラフを分割することが可能です。
是非試してみてください!
それでは🌏