我想在matplotlib中使用以下布局:
图像1a图像1b图像2a图像2b颜色条a颜色条b
Colorbar a用于图像集a,而Colobar 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])
这个问题是对colorbar()的调用搞乱了图像的轴限制,即使我在ImageGrid()中指定了share_all = False。
这有什么提示吗?非常感谢。
答案 0 :(得分:1)
为了将来参考,有一个完整的工作示例是有帮助的,这样有人可以复制和粘贴您的代码并直接重现您的问题。例如,我可以看到您已导入ImageGrid
,但完整导入语句会对此有所帮助,就像为data1a
,data1b
等创建假数据集一样。< / p>
此外,您的上述语句中(1,6)
似乎有(1,4)
grid = ImageGrid(fig, 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
表示&#34;将底角置于x=1.01
和y=bbox_ax.y0
&#34;。后两个条目0.02, bbox_ax.y1-bbox_ax.y0
分别定义了色条轴的水平和垂直宽度。我喜欢颜色条轴与绘图轴齐平,所以我使用bbox_ax.y1-bbox_ax.y0
作为垂直宽度。
请注意,我使用的是mp.subplots()
而不是ImageGrid()
,因为我并不熟悉后者,我不会认为它是{s}必要的。
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)
这产生了下图:
您也可以将此作为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)
产生这个数字:
答案 1 :(得分:0)
使用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()