每个子图中的matplotlib颜色条

79

我想在一个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()

我以为这就是正确的做法,但结果绘制出来的图像很混乱:整个背景都是灰色的,并且忽略了我设置的set_xlim、set_ylim命令(这里为简单起见未显示),而且没有任何颜色条。这是正确的做法吗?

我还试过去掉"cax = ...",但那样的话,色条就全部放在右下角的图中,而不是分别放在每个图中!


plt.colorbar(z1_plot,cax=ax2) 应该改为 plt.colorbar(z2_plot,cax=ax2),3 和 4 也是如此吗?对于子图和色条,建议查看 AxesGrid - oschoudhury
5个回答

69

使用实用工具 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');

58

plt.colorbar(z1_plot,cax=ax1)中,使用ax=代替cax=,即plt.colorbar(z1_plot,ax=ax1)


1
要添加:fig.colorbar(sm, ax=fig.get_axes()) 将在两个轴上添加颜色条。 - IljaBek

47

指定 ax 参数给 matplotlib.pyplot.colorbar(),例如:

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

enter image description here


33
请查看此matplotlib示例页面。在那里,展示了如何使用四个单独的颜色条为每个子图获取以下绘图:enter image description here

希望这可以帮到您。
您还可以进一步查看这里,在那里您可以找到许多可以使用matplotlib完成的内容。


1
另一个matplotlib示例:https://matplotlib.org/stable/gallery/subplots_axes_and_figures/colorbar_placement.html - Avi Vajpeyi

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接