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

假如想象 提交于 2019-12-11 10:33:19

问题


I wish to create a "split plot", i.e. to use different colormaps in the left and the right half of my plot. Accordingly I will need two different colorbars. Unfortunately I have to set the position of the second colorbar by hand and modify everytime a label or title is included. Is there a way to automatise that?

I wondered if I could extract the rect parameter of the following minimal example from the right colorbar. That would help me as I only had shift it a bit. Any other (/better) idea is also welcome.

At the moment, whenever I change the labels or title a bit the manually set position of the left colorbar has to be modified again. This is very annoying. I include a running minimal example and a the output it produces:

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

output:

Thanks in advance!


回答1:


There are of course several ways to create a colorbar axes and put it next to a plot. I would recommend reading those questions:

  • positioning the colorbar
  • Matplotlib 2 Subplots, 1 Colorbar

Many of those concepts can be extended to a second colorbar. The solution I would personally prefer is the following, which uses an axes divider. The advantage is that the colorbar keeps the size of the axes.

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



来源:https://stackoverflow.com/questions/47336309/how-to-obtain-correct-size-for-a-second-colorbar-in-matplotlib-plot

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!