2017-08-03 32 views
3

matplotlibを使用すると、行ごとに異なる数の列を持つグリッド上に複数のサブプロットを表示したいと思います。各サブプロットはおおよそ同じサイズで、サブプロットは斜めグリッドの配列matplotlibのサブプロット

Grid of axes in pattern (2, 3, 2)

gridspecと2、3、2パターンを有するグリッドを作成するために、かなり単純な問題だが、問題はそのgridspec、当然、整列があります:多かれ少なかれ、このように、集中していますそれらをグリッドに表示するので、2つのプロットを含む行のプロットはより広い:

ここ Grid aligned with gridspec

はそれを生成するためのコードです:

from matplotlib import gridspec 
from matplotlib import pyplot as plt 

fig = plt.figure() 

arrangement = (2, 3, 2) 
nrows = len(arrangement) 

gs = gridspec.GridSpec(nrows, 1) 
ax_specs = [] 
for r, ncols in enumerate(arrangement): 
    gs_row = gridspec.GridSpecFromSubplotSpec(1, ncols, subplot_spec=gs[r]) 
    for col in range(ncols): 
     ax = plt.Subplot(fig, gs_row[col]) 
     fig.add_subplot(ax) 

for i, ax in enumerate(fig.axes): 
    ax.text(0.5, 0.5, "Axis: {}".format(i), fontweight='bold', 
      va="center", ha="center") 
    ax.tick_params(axis='both', bottom='off', top='off', left='off', 
        right='off', labelbottom='off', labelleft='off') 

plt.tight_layout() 

私はサブプロットの束を設定し、それの形状を働くことによって彼らの配置を微調整することができることを知って、私はそれが得ることができると思います複雑なので、よりシンプルな方法が利用できることを期待していました。

私は例として(2,3,2)の配置を使用していますが、私はこれを行うだけでなく、任意のコレクションに対してこれを実行したいと思います。

答えて

3

通常、考えられるのは、サブプロット間の共通分母、すなわち所望のグリッドを構成できる最大のサブプロットを見つけ出し、所望のレイアウトが達成されるようにそれらのいくつかにすべてのサブプロットを張ることである。

enter image description here

ここでは、3行6列を有し、各サブプロットは、第二にしつつ、第1行スパンサブプロットでサブプロットは、1/2及び3/4を位置決めわずかこと、1行2列にまたがります行は0,1,2,3,4,5の位置にあります。

import matplotlib.pyplot as plt 
import matplotlib.gridspec as gridspec 

gs = gridspec.GridSpec(3, 6) 
ax1a = plt.subplot(gs[0, 1:3]) 
ax1b = plt.subplot(gs[0, 3:5]) 
ax2a = plt.subplot(gs[1, :2]) 
ax2b = plt.subplot(gs[1, 2:4]) 
ax2c = plt.subplot(gs[1, 4:]) 
ax3a = plt.subplot(gs[2, 1:3]) 
ax3b = plt.subplot(gs[2, 3:5]) 


for i, ax in enumerate(plt.gcf().axes): 
    ax.text(0.5, 0.5, "Axis: {}".format(i), fontweight='bold', 
      va="center", ha="center") 
    ax.tick_params(axis='both', bottom='off', top='off', left='off', 
        right='off', labelbottom='off', labelleft='off') 

plt.tight_layout() 

plt.show() 

enter image description here

+0

フム...うん、私はこれを検討しました。それを一般化するのがどれほど簡単かを見てみましょう。 – Paul

+0

実際、長さが常にnまたは長さn-1の場合、 'n * 2'グリッドを実行すれば十分です。これは非常に簡単です。 – Paul

関連する問題