每个子图中的matplotlib颜色条

82 投票
5 回答
261227 浏览
提问于 2025-04-18 07:38

我想在一个2x2的图中给每个小图添加一个单独的颜色条。

fig , ( (ax1,ax2) , (ax3,ax4)) = plt.subplots(2, 2,sharex = True,sharey=True)
z1_plot = ax1.scatter(x,y,c = z1,vmin=0.0,vmax=0.4)
plt.colorbar(z1_plot,cax=ax1)
z2_plot = ax2.scatter(x,y,c = z2,vmin=0.0,vmax=40)
plt.colorbar(z1_plot,cax=ax2)
z3_plot = ax3.scatter(x,y,c = z3,vmin=0.0,vmax=894)
plt.colorbar(z1_plot,cax=ax3)
z4_plot = ax4.scatter(x,y,c = z4,vmin=0.0,vmax=234324)
plt.colorbar(z1_plot,cax=ax4)
plt.show()

我以为这样做就可以了,但结果图看起来很糟糕;背景全是灰色,完全忽略了我设置的坐标范围(为了简单起见,这里没显示)。而且没有显示任何颜色条。这真的是正确的方法吗?

我还尝试去掉“cax = ...”,但这样颜色条就全都集中在右下角的小图上,而不是每个小图都有一个!

5 个回答

3

试着使用下面的函数来添加颜色条:

def add_colorbar(mappable):
    from mpl_toolkits.axes_grid1 import make_axes_locatable
    import matplotlib.pyplot as plt
    last_axes = plt.gca()
    ax = mappable.axes
    fig = ax.figure
    divider = make_axes_locatable(ax)
    cax = divider.append_axes("right", size="5%", pad=0.05)
    cbar = fig.colorbar(mappable, cax=cax)
    plt.sca(last_axes)
    return cbar

然后你的代码需要修改成:

fig , ( (ax1,ax2) , (ax3,ax4)) = plt.subplots(2, 2,sharex = True,sharey=True)
z1_plot = ax1.scatter(x,y,c = z1,vmin=0.0,vmax=0.4)
add_colorbar(z1_plot)
48

在使用 matplotlib.pyplot.colorbar() 这个函数时,可以指定一个叫做 ax 的参数,比如这样:

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots(2, 2)
for i in range(2):
    for j in range(2):
         data = np.array([[i, j], [i+0.5, j+0.5]])
         im = ax[i, j].imshow(data)
         plt.colorbar(im, ax=ax[i, j])

plt.show()

这里插入图片描述

59

plt.colorbar(z1_plot,cax=ax1)这段代码中,应该用ax=来代替cax=,也就是说,正确的写法是plt.colorbar(z1_plot,ax=ax1)

71

这个问题可以很简单地通过一个工具 make_axes_locatable 来解决。我提供了一个简单的例子,展示了这个工具是怎么工作的,并且你可以很容易地根据自己的需要进行调整:

每个图像旁边的条形图

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable

import numpy as np

m1 = np.random.rand(3, 3)
m2 = np.arange(0, 3*3, 1).reshape((3, 3))

fig = plt.figure(figsize=(16, 12))
ax1 = fig.add_subplot(121)
im1 = ax1.imshow(m1, interpolation='None')

divider = make_axes_locatable(ax1)
cax = divider.append_axes('right', size='5%', pad=0.05)
fig.colorbar(im1, cax=cax, orientation='vertical')

ax2 = fig.add_subplot(122)
im2 = ax2.imshow(m2, interpolation='None')

divider = make_axes_locatable(ax2)
cax = divider.append_axes('right', size='5%', pad=0.05)
fig.colorbar(im2, cax=cax, orientation='vertical');
33

请看看这个 matplotlib 示例页面。在这里,你可以看到如何绘制出下面这个图,里面有四个不同的颜色条,分别对应每个子图: enter image description here

希望这对你有帮助。
你还可以在 这里 查看更多内容,里面有很多关于 matplotlib 的使用示例。

撰写回答