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

时间:2017-11-16 17:59:17

标签: python matplotlib plot colorbar imshow

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

我想知道是否可以从右侧颜色条中提取以下最小示例的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()

输出: enter image description here

提前致谢!

1 个答案:

答案 0 :(得分:2)

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

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

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()

enter image description here