将颜色条添加到现有轴

时间:2015-09-08 16:32:40

标签: python matplotlib

我正在制作一些互动图,我想添加一个颜色条图例。我不希望颜色条在它自己的轴上,所以我想将它添加到现有轴。我这样做有困难,因为我发现的大多数示例代码都为colorbar创建了一个新轴。

我使用matplotlib.colorbar.ColorbarBase尝试了以下代码,它为现有的轴添加了一个颜色条,但它给了我奇怪的结果,我无法弄清楚如何指定颜色条的属性(例如,在它放置的轴上和它的大小)

import matplotlib
import matplotlib.pyplot as plt
from matplotlib.cm import coolwarm
import numpy as np

x = np.random.uniform(1, 10, 10)
y = np.random.uniform(1, 10, 10)
v = np.random.uniform(1, 10, 10)

fig, ax = plt.subplots()

s = ax.scatter(x, y, c=v, cmap=coolwarm)

matplotlib.colorbar.ColorbarBase(ax=ax, cmap=coolwarm, values=sorted(v),
                                 orientation="horizontal")

使用fig.colorbar代替matplotlib.colorbar.ColorbarBase仍然无法满足我的需求,而且我仍然不知道如何调整颜色条的属性。

fig.colorbar(s, ax=ax, cax=ax)

enter image description here

假设我想在左上角放置颜色条,在图的顶部延伸一半左右。我该怎么做呢?

我最好为此编写一个自定义函数,可能使用LineCollection

3 个答案:

答案 0 :(得分:42)

该技术通常用于图中的多轴。在这种情况下,通常需要使用颜色栏,其大小与imshow的结果相对应。这可以使用axes grid工具包轻松实现:

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

data = np.arange(100, 0, -1).reshape(10, 10)

fig, ax = plt.subplots()
divider = make_axes_locatable(ax)
cax = divider.append_axes('right', size='5%', pad=0.05)

im = ax.imshow(data, cmap='bone')

fig.colorbar(im, cax=cax, orientation='vertical')
plt.show()

Image with proper colorbar in size

答案 1 :(得分:34)

颜色条必须有自己的轴。但是,您可以创建与前一个轴重叠的轴。然后使用cax kwarg告诉fig.colorbar使用新轴。

例如:

import numpy as np
import matplotlib.pyplot as plt

data = np.arange(100, 0, -1).reshape(10, 10)

fig, ax = plt.subplots()
cax = fig.add_axes([0.27, 0.8, 0.5, 0.05])

im = ax.imshow(data, cmap='gist_earth')
fig.colorbar(im, cax=cax, orientation='horizontal')
plt.show()

enter image description here

答案 2 :(得分:3)

不能将其添加为注释,但是如果有人有兴趣将接受的答案与子图一起使用,则应在特定的轴对象上(而不是在从plt.subplots返回的numpy.ndarray上)形成分隔线。 / p>

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
data = np.arange(100, 0, -1).reshape(10, 10)
fig, ax = plt.subplots(ncols=2, nrows=2)
for row in ax:
    for col in row:
        im = col.imshow(data, cmap='bone')
        divider = make_axes_locatable(col)
        cax = divider.append_axes('right', size='5%', pad=0.05)
        fig.colorbar(im, cax=cax, orientation='vertical')
plt.show()