簡體   English   中英

matplotlib子圖具有相同的縱橫比和單獨的顏色條

[英]matplotlib subplots with equal aspect ratio and individual colorbars

我想繪制4個具有相同寬高比的子圖和每個子圖的單獨顏色條。 我差不多完成了,但是我的字體非常大,而且當它們與x軸標題重疊時,顏色條位置很差; 查看附加的代碼和生成的圖像。 如何獲得更好的結果?

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')

在此輸入圖像描述

除了我的評論:

  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')

這產生了下面的圖像。

在此輸入圖像描述

我只是不確定為填充獲取自動值。 也許其他人可以貢獻?

為了創建具有n水平顏色條(每個軸下方一個)的n個子圖,您可以創建2*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()

在此輸入圖像描述

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

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')

我不確定這是否是最好的方法來做到這一點,但很簡單就可以快速完成:)另外,你應該考慮設置圖形大小的建議。 我希望它有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM