如何在 matplotlib 图中获得第二个颜色条的正确大小?

How to obtain correct size for a second colorbar in matplotlib plot?

我想创建一个 "split plot",即在我的绘图的左右半部分使用不同的颜色图。因此,我需要两个不同的颜色条。不幸的是,我必须手动设置第二个颜色条的位置,并在每次包含标签或标题时进行修改。有没有办法让它自动化?

我想知道是否可以从右侧颜色条中提取以下最小示例的 rect 参数。这对我有帮助,因为我只改变了一点。也欢迎任何其他(/更好的)想法。

目前,每当我稍微更改标签或标题时,都必须再次修改左侧颜色条的手动设置位置。这很烦人。我包括一个 运行 最小示例和它产生的输出:

import matplotlib as mpl
params = {
           'xtick.direction' : 'out',
           'ytick.direction' : 'out',
           'text.usetex'     : True,
         }

mpl.rcParams.update(params)
mpl.rcParams.update({'figure.autolayout': True})

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as colors


extent_arr1 = [-1,0, -1,1]
extent_arr2 = [ 0,1, -1,1]
M = 501

# define test-data
data_arr1  = np.zeros((M, M)) 
data_arr2 = np.ones((M, M)) 

# define figure
fig = plt.figure()
ax = fig.add_subplot(111)

# left plot:
image1 = ax.imshow( data_arr1,  cmap='jet', interpolation='bilinear', extent=extent_arr1, \
                     origin='lower')
plt.title("Minimal example")
cbar1  = plt.colorbar(image1)

# right plot:
image2 = ax.imshow( data_arr2, cmap='gnuplot', interpolation='bilinear', extent=extent_arr2, \
                     origin='lower')

# define axes-labels:
plt.xlabel(r"$x$")
plt.ylabel(r"$y$")

# define colour-bar at left side:
rect_loc = [0.0, 0.08, 0.03, 0.88]  # define position ---> how to automatise this?
cax2 = fig.add_axes(rect_loc)       # left | bottom | width | height
cbar2  = plt.colorbar(image2, cax=cax2)
cbar2.ax.yaxis.set_ticks_position('left')

# set limits:
ax.set_xlim(-1,1)
ax.set_ylim(-1,1)

plt.show()

输出:

提前致谢!

当然有几种方法可以创建颜色条轴并将其放在绘图旁边。我建议阅读这些问题:

  • positioning the colorbar
  • Matplotlib 2 Subplots, 1 Colorbar

其中许多概念都可以扩展到第二个颜色栏。我个人更喜欢的解决方案如下,它使用轴分隔器。优点是颜色条保持轴的大小。

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
import numpy as np; np.random.seed(1)

plt.rcParams.update({'figure.autolayout': True})

fig, ax = plt.subplots(figsize=(6,4))
im = ax.imshow(np.random.rand(10,10), extent=[-1,0,0,1], cmap="RdYlGn")
im2 = ax.imshow(np.random.rand(10,10), extent=[0,1,0,1], cmap="magma")
ax.set_xlabel("x label")
ax.set_ylabel("y label")
ax.set_xlim(-1,1)
ax.set_ylim(0,1)

divider = make_axes_locatable(ax)
cax = divider.new_horizontal(size="5%", pad=0.2)
fig.add_axes(cax)
fig.colorbar(im2, cax=cax)

cax2 = divider.new_horizontal(size="5%", pad=0.7, pack_start=True)
fig.add_axes(cax2)
cb2 = fig.colorbar(im, cax=cax2)
cb2.ax.yaxis.set_ticks_position('left')
plt.show()