matplotlib中图像网格上的两个色条

2024-06-09 15:10:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望在matplotlib中有以下布局:

图像1a图像1b图像2a图像2b Colorbar a Colorbar b

Colorbar a用于图像集a,Colorbar b用于图像集b

我尝试过使用ImageGrid来创建图像的轴,但是没有成功地使颜色条正确。例如:

fig = plt.figure()
grid = ImageGrid(fig, 111, (1,6), aspect=False, share_all=False)

# Get data1a, data1b, ...

im1a = grid[0].pcolormesh(data1a)
im1b = grid[1].pcolormesh(data1b)
im2a = grid[2].pcolormesh(data2a)
im2b = grid[3].pcolormesh(data2b)

plt.colorbar(im1a, cax=grid[4])
plt.colorbar(im1b, cax=grid[5])

问题在于,尽管我在ImageGrid()中指定share帴all=False,但对colorbar()的调用扰乱了图像的轴限制。在

有什么提示吗?非常感谢。在


Tags: 图像falsesharefigpltallgridpcolormesh
2条回答

使用pcolormesh,默认情况下是自动绘制到轴上的,不需要任何特殊处理来创建色条。在

最简单的方法是使用列宽不等的网格。剩下的就自动来了。在

import matplotlib.pyplot as plt
import numpy as np

fig, axes = plt.subplots(ncols=6,figsize=(7,2.2), 
                  gridspec_kw={"width_ratios":[1,1,1,1, 0.08,0.08]})
fig.subplots_adjust(wspace=0.6)

im0  = axes[0].pcolormesh(np.random.rand(11,11), vmin=0, vmax=1, cmap="RdBu")
im1  = axes[1].pcolormesh(np.random.rand(11,11), vmin=0, vmax=1, cmap="RdBu")
im2  = axes[2].pcolormesh(np.random.rand(11,11), vmin=0, vmax=1)
im3  = axes[3].pcolormesh(np.random.rand(11,11), vmin=0, vmax=1)

axes[0].set_ylabel("y label")

fig.colorbar(im0, cax=axes[4])
fig.colorbar(im2, cax=axes[5])

plt.show()

enter image description here

为了将来的参考,有一个完整的工作示例很有帮助,以便有人可以复制和粘贴您的代码,并直接重现您的问题。例如,我可以看到您已经导入了ImageGrid,但是完整的import语句将有助于实现这一点,为data1adata1b等创建假数据集也是如此

另外,看起来你有一个(1,6),在上面的语句中应该有(1,4),尽管这不是解决问题的方法。在

当我需要两个或更多的颜色条时,我的方法通常是在一个轴上使用get_position(),它将轴角点的坐标作为属性x0,y0,x1,y1返回。从这里开始,我分别定义每个colorbar的轴,并将每个轴精确地放置在我想要的位置。为了满足您的需要,您必须在下面的代码中修改fig.add_axes([1.01, bbox_ax.y0, 0.02, bbox_ax.y1-bbox_ax.y0])的细节。例如,前两个条目1.01, bbox_ax.y0表示“将下角放在x=1.01y=bbox_ax.y0”。第二个条目0.02, bbox_ax.y1-bbox_ax.y0分别定义colorbar轴的水平和垂直宽度。我喜欢colorbar轴与绘图轴齐平,因此我使用bbox_ax.y1-bbox_ax.y0作为垂直宽度。在

请注意,我使用的是mp.subplots(),而不是{},因为我对后者不太熟悉,我认为没有必要。在

import matplotlib.pyplot as mp
import numpy
import mpl_toolkits.axes_grid1

data1a = numpy.random.rand(100,100)
data1b = numpy.random.rand(100,100)
data2a = numpy.random.rand(100,100)
data2b = numpy.random.rand(100,100)

fig, axes = mp.subplots(1, 4, figsize=(8,2))

im1a = axes[0].pcolormesh(data1a, cmap='magma')
im1b = axes[1].pcolormesh(data1b, cmap='magma')
im2a = axes[2].pcolormesh(data2a, cmap='viridis')
im2b = axes[3].pcolormesh(data2b, cmap='viridis')

fig.tight_layout()

# get bounding box information for the axes (since they're in a line, you only care about the top and bottom)
bbox_ax = axes[0].get_position()

# fig.add_axes() adds the colorbar axes
# they're bounded by [x0, y0, x_width, y_width]
cbar_im1a_ax = fig.add_axes([1.01, bbox_ax.y0, 0.02, bbox_ax.y1-bbox_ax.y0])
cbar_im1a = mp.colorbar(im1a, cax=cbar_im1a_ax)

cbar_im2a_ax = fig.add_axes([1.09, bbox_ax.y0, 0.02, bbox_ax.y1-bbox_ax.y0])
cbar_im1a = mp.colorbar(im2a, cax=cbar_im2a_ax)

这将生成下图:

enter image description here

也可以使用稍微不同的语法将其作为2x2网格来执行:

^{pr2}$

这就产生了这个数字:

enter image description here

相关问题 更多 >