2017-09-27 65 views
1

我想繪製4個子圖,每個子圖具有相等的縱橫比和單獨的顏色條。我差不多完成了,但是我的字體非常大,並且顏色條與X軸標題重疊時位置很差;看到附加的代碼和生成的圖像。如何獲得更好的結果?matplotlib具有相等縱橫比和個別顏色條的子圖

import numpy 
import matplotlib.pyplot as plt 
data = numpy.random.random((3, 10)) 
fig, (ax1, ax2, ax3, ax4) = plt.subplots(nrows=4) 
im1 = ax1.pcolormesh(data) 
ax1.set_title('IM1') 
im2 = ax2.pcolormesh(data) 
ax2.set_title('IM2') 
im3 = ax3.pcolormesh(data) 
ax3.set_title('IM3') 
im4 = ax4.pcolormesh(data) 
ax4.set_title('IM4') 
for ax, tc in zip((ax1, ax2, ax3, ax4), (im1, im2, im3, im4)): 
    ax.tick_params(direction='out', which='both', top=True, right=True) 
    ax.minorticks_on() 
    ax.set_aspect('equal') 
    ax.set_xlabel('$x$') 
    ax.set_ylabel('$y$') 
    fig.colorbar(tc, ax=ax, orientation='horizontal') 
fig.tight_layout() 
fig.savefig('im.png', dpi=300, bbox_inches='tight') 

enter image description here

+0

我不知道的colorbars的正確自動定位,但我可以指定數字的大小,以使字體比例的建議提供。例如:'... plt.subplots(...,figsize =(50,10))' –

+0

我不確定是否決定讓4個子圖形垂直堆疊是由於其他約束,但是停止重疊標籤等可以通過不同的子圖的佈局變得更容易。 – DavidG

回答

2

除了我的評論:

  1. 您可以縮放字體大小通過更改其大小或通過改變圖形的大小。如果我們使用後者,您可以使用:... plt.subplots(..., figsize=(50,10))

  2. 您可以通過將「附加」到相關軸來更好地放置顏色條。

對於這兩個點看到該更新的例子:

import numpy 
import matplotlib.pyplot as plt 
from mpl_toolkits.axes_grid1 import make_axes_locatable 

data = numpy.random.random((3, 10)) 
fig, (ax1, ax2, ax3, ax4) = plt.subplots(nrows=4,figsize=(50,10)) 
im1 = ax1.pcolormesh(data) 
ax1.set_title('IM1') 
im2 = ax2.pcolormesh(data) 
ax2.set_title('IM2') 
im3 = ax3.pcolormesh(data) 
ax3.set_title('IM3') 
im4 = ax4.pcolormesh(data) 
ax4.set_title('IM4') 

for ax, im in zip((ax1, ax2, ax3, ax4), (im1, im2, im3, im4)): 
    ax.tick_params(direction='out', which='both', top=True, right=True) 
    ax.minorticks_on() 
    ax.set_aspect('equal') 
    ax.set_xlabel('$x$') 
    ax.set_ylabel('$y$') 
    div = make_axes_locatable(ax) 
    cax = div.append_axes("bottom", size="20%", pad=0.5) 
    cbar = plt.colorbar(im,cax=cax,orientation='horizontal') 

fig.tight_layout() 
fig.savefig('im.png', dpi=300, bbox_inches='tight') 

將會產生下面的圖片。

enter image description here

我只是不知道得到一個自動值來填充。也許別人可以貢獻?

+0

我認爲它很難自動調整填充,因爲它也將取決於字體大小。但是,您在這裏選擇的價值對於默認情況似乎沒有問題。 – ImportanceOfBeingErnest

0

您可以爲每個元素設置字體大小並更改色條的位置。這是我的解決方案:

import numpy 
import matplotlib.pyplot as plt 
data = numpy.random.random((3, 10)) 
fig, (ax1, ax2, ax3, ax4) = plt.subplots(nrows=4) 
im1 = ax1.pcolormesh(data) 
ax1.set_title('IM1', size = 3) # size arguments for font changes 
im2 = ax2.pcolormesh(data) 
ax2.set_title('IM2', size = 3) 
im3 = ax3.pcolormesh(data) 
ax3.set_title('IM3', size = 3) 
im4 = ax4.pcolormesh(data) 
ax4.set_title('IM4', size = 3) 
for ax, tc in zip((ax1, ax2, ax3, ax4), (im1, im2, im3, im4)): 
    ax.tick_params(labelsize = 3, direction='out', which='both', top=True, right=True) 
    ax.minorticks_on() 
    ax.set_aspect('equal') 
    ax.set_xlabel('$x$', size = 3) 
    ax.set_ylabel('$y$', size = 3) 
    cbar = fig.colorbar(tc, ax=ax, orientation='horizontal', pad=0.5) # pad for positioning colorbar 
    cbar.ax.tick_params(labelsize=2) # labelsize for colorbar 
fig.tight_layout() 
fig.savefig('im.png', dpi=300, bbox_inches='tight') 

我不知道,如果是這樣做,但足夠簡單,快快行動吧:)另外的最佳方式,你應該考慮的建議,設置圖形的大小。 我希望它有幫助!

1

要創建n子圖和n水平彩條(每個軸下面有一個),您可以創建軸座標軸網格,其中每個第二軸的高度要小得多。這些較小的軸可以容納顏色條。

import numpy as np 
import matplotlib.pyplot as plt 

n=4 
data = np.random.random((3, 10)) 
ratios = np.ones(2*n) 
ratios[1::2]=0.05 
fig, axes = plt.subplots(nrows=2*n, figsize=(4,2*n), 
         gridspec_kw={"height_ratios":ratios}) 

for i,ax in enumerate(axes[::2]): 
    im = ax.pcolormesh(data) 
    ax.set_title('IM{}'.format(i+1)) 
    ax.tick_params(direction='out', which='both', top=True, right=True) 
    ax.minorticks_on() 
    ax.set_aspect('equal') 
    ax.set_xlabel('$x$') 
    ax.set_ylabel('$y$') 
    fig.colorbar(im, cax=axes[2*i+1], orientation='horizontal') 

fig.tight_layout() 
fig.savefig('im.png', dpi=300, bbox_inches='tight') 

plt.show() 

enter image description here

相關問題