我想绘制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')
答案 0 :(得分:2)
除了我的评论:
您可以通过更改字体大小或更改图形大小来缩放字体大小。如果我们执行后者,您可以使用:... plt.subplots(..., figsize=(50,10))
您可以通过将颜色条“附加”到相关轴来更好地放置颜色条。
对于这两点,请参阅此更新示例:
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')
生成下图。
我只是不确定为填充获取自动值。也许其他人可以贡献?
答案 1 :(得分:1)
为了使用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()
答案 2 :(得分: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')
我不确定这是否是最好的方法来做到这一点,但很简单就可以快速完成:)另外,你应该考虑设置图形大小的建议。 我希望它有所帮助!