gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:48:50 37 4
gpt4 key购买 nike

我想在 matplotlib 中有以下布局:

图像 1a 图像 1b 图像 2a 图像 2b 颜色条 a 颜色条 b

颜色条 a 用于图像集 a,颜色条 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() 的调用也会弄乱图像的轴限制。

这方面有什么建议吗?非常感谢。

最佳答案

为了将来的引用,拥有一个完整的工作示例会有所帮助,以便有人可以复制并粘贴您的代码并直接重现您的问题。例如,我可以看到您已导入 ImageGrid,但完整的导入语句将对此有所帮助,就像为 data1adata1b< 创建假数据集一样

另外,看起来您有一个 (1,6) ,在上面的语句中您应该有 (1,4) : grid = ImageGrid (图,111,(1,4),aspect=False,share_all=False),尽管这不是您问题的解决方案。

当我想要两个或更多颜色条时,我的方法通常是在轴上使用 get_position() ,它将轴角的坐标作为属性 x0,y0,x1 返回,y1。从这里开始,我分别定义每个颜色条的轴,并将每个颜色条精确地放置在我想要的位置。为了使其满足您的需求,您必须修改代码中 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 分别定义颜色条轴的水平和垂直宽度。我喜欢颜色条轴与绘图轴齐平,因此我使用 bbox_ax.y1-bbox_ax.y0 作为垂直宽度。

请注意,我使用的是 mp.subplots() 而不是 ImageGrid(),因为我对后者不太熟悉,而且我也不知道觉得有必要。

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 网格来执行,语法略有不同:

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

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

fig.tight_layout()

bbox_ax_top = axes[0,1].get_position()
bbox_ax_bottom = axes[1,1].get_position()

cbar_im1a_ax = fig.add_axes([1.01, bbox_ax_top.y0, 0.02, bbox_ax_top.y1-bbox_ax_top.y0])
cbar_im1a = mp.colorbar(im1a, cax=cbar_im1a_ax)

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

产生这个数字:

enter image description here

关于python - matplotlib 中图像网格上的两个颜色条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46040631/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com