2016-07-18 10 views
2

私はかなり新しいpythonです。現在matplotlibを使用していますが、プロットを行うために別のスクリプトに渡すために、可変数のサブプロットを返すスクリプトがあります。私は、これらのサブプロットを素晴らしい配置、すなわち「正方形に最も近いもの」に配置したいと考えています。答えはユニークですので、私は列の重みの数値を高くしてみましょう。データを「最も近い正方形」に整形する

例:6つのプロットがあり、必要なグリッドは2x3です。私は9を持っている場合、それは3x3です。私に12があるなら、それは3x4です。私は17を持っている場合、それは4x5ですが、最後の行の1つだけが作成されます。

ソリューションの試み:私は簡単に十分な大きさです最寄りの広場を見つけることができます:

num_plots = 6 
    square_size = ceil(sqrt(num_plots))**2 

しかし、これは空のプロットを残します。正しいグリッドサイズを作成する方法はありますか?

答えて

2

あなたが5または7のようなプロットの素数をお持ちの場合は、1行または1列に行くしない限り、これは私が過去

num_plots = 6 
nr = int(num_plots**0.5) 
nc = num_plots/nr 
if nr*nc < num_plots: 
    nr+=1 
fig,axs = pyplot.subplots(nr,nc,sharex=True,sharey=True) 
+0

これはほとんど正しいです - 私たちは奇数を持っている場合、グリッドの最後に空のプロットがあるだろう除き。それらを防ぐ方法はありますか? – user6605695

+1

空のグリッドスポットは凡例を追加するのに便利です。同様に@EL_DONは、プロットの素数が2つ以上の行や列に均等に分割されることはないということが正しいです。 – esmit

2

でやっていること、それを行うための方法はありません。 9または15のプロットがある場合、それはうまくいくはずです。

次の例では、一つだけのプロットやプロットの1行があります場合でも、あなたは一般的に、インデックス、それをできるように

  • 空白余分な空のプロット
  • が2D配列であることを軸ポインタを強制する方法を示し

をごループなど、各プロットのための正しい行と列を検索ここでは、次のとおりです。

nplots=13 
#find number of columns, rows, and empty plots 
nc=int(nplots**0.5) 
nr=int(ceil(nplots/float(nc))) 
empty=nr*nc-nplots 
#make the plot grid 
f,ax=pyplot.subplots(nr,nc,sharex=True) 

#force ax to have two axes so we can index it properly 
if nplots==1: 
    ax=array([ax]) 
if nc==1: 
    ax=ax.reshape(nr,1) 
if nr==1: 
    ax=ax.reshape(1,nc) 

#hide the unused subplots 
for i in range(empty): ax[-(1+i),-1].axis('off') 

#loop through subplots and make output 
for i in range(nplots): 
    ic=i/nr #find which row we're on. If the definitions of ir and ic are switched, the indecies for empty (above) should be switched, too. 
    ir=mod(i,nr) #find which column we're on 
    axx=ax[ir,ic] #get a pointer to the subplot we're working with 
    axx.set_title(i) 

Example result using nplots=1, nplots=3, and nplots=13

+0

例えば7のような素数がある場合、出力は2x4になり、2番目の行の最後の項目は含まれません。 – user6605695

+0

@ user6605695 2x4を1つ空にすることも、1x7にすることもできます。代替案は、2x3 + 1倍のサイズのプロットを持つことですが、そのロジックはもっと長くなります。 –

+0

使用していない軸の代わりに空白を入れたいだけですか? '' 'f、ax = plt.subplots(4,2) ax [-1、-1] .axis( 'off')' '' –

関連する問題