73

我有一个带有颜色条的 matplotlib 图。我想定位颜色条,使其水平,并在我的情节下方。

我几乎通过以下方式做到了这一点:

plt.colorbar(orientation="horizontal",fraction=0.07,anchor=(1.0,0.0))

但是颜色条仍然与绘图略有重叠(以及 x 轴的标签)。我想将颜色条进一步向下移动,但我不知道该怎么做。

4

2 回答 2

108

使用填充pad

为了相对于子图移动颜色条,可以使用pad参数 to fig.colorbar

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(1)

fig, ax = plt.subplots(figsize=(4,4))
im = ax.imshow(np.random.rand(11,16))
ax.set_xlabel("x label")

fig.colorbar(im, orientation="horizontal", pad=0.2)
plt.show()

在此处输入图像描述

使用轴分隔器

可以使用 的实例make_axes_locatable来划分轴并创建一个与图像图完全对齐的新轴。同样,该pad参数将允许设置两个轴之间的空间。

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

fig, ax = plt.subplots(figsize=(4,4))
im = ax.imshow(np.random.rand(11,16))
ax.set_xlabel("x label")

divider = make_axes_locatable(ax)
cax = divider.new_vertical(size="5%", pad=0.7, pack_start=True)
fig.add_axes(cax)
fig.colorbar(im, cax=cax, orientation="horizontal")

plt.show()

在此处输入图像描述

使用子图

可以直接创建两排子图,一排图片,一排彩条。然后,在图形创建中设置height_ratiosgridspec_kw={"height_ratios":[1, 0.05]}使其中一个子图的高度比另一个小得多,并且这个小子图可以承载颜色条。

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(1)

fig, (ax, cax) = plt.subplots(nrows=2,figsize=(4,4), 
                  gridspec_kw={"height_ratios":[1, 0.05]})
im = ax.imshow(np.random.rand(11,16))
ax.set_xlabel("x label")

fig.colorbar(im, cax=cax, orientation="horizontal")

plt.show()

在此处输入图像描述

于 2017-04-15T10:48:40.357 回答
73

编辑:更新matplotlib版本> = 3。

这个答案已经分享了三种很好的方法。

matplotlib 文档建议使用inset_locator. 这将按如下方式工作:

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
import numpy as np

rng = np.random.default_rng(1)

fig, ax = plt.subplots(figsize=(4,4))
im = ax.imshow(rng.random((11, 16)))
ax.set_xlabel("x label")

axins = inset_axes(ax,
                    width="100%",  
                    height="5%",
                    loc='lower center',
                    borderpad=-5
                   )
fig.colorbar(im, cax=axins, orientation="horizontal")

代码输出

于 2012-11-09T16:23:11.387 回答