给现有的坐标轴添加色条

83
我正在制作一些交互式图表,想要添加一个色标图例。我不想让色标图例在自己的坐标轴上显示,而是想要将其添加到现有的坐标轴上。但是我在实现这个过程中遇到了困难,因为我找到的大部分示例代码都是为色标图例创建一个新的坐标轴。
我尝试了使用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仍然不能完全满足我的需求,而且我还不知道如何调整colorbar的属性。
fig.colorbar(s, ax=ax, cax=ax)

enter image description here

假设我想将色条放在图的左上角,横跨图的顶部一半的位置。我该如何实现这个效果?
也许我最好写一个自定义函数来实现这个功能,可以使用LineCollection吗?

我对此无法回答。但是,为什么你想让色条成为现有坐标轴的一部分,而不是给它一个新的坐标轴呢? - tnknepp
@tnknepp 我正在制作带有缩放/平移、切换图形等交互式绘图。对我来说,不必为色条创建新的坐标轴会更容易。 - C_Z_
为什么你不能只是使用 fig.colorbar(ax=ax) 呢? - tmdavison
@tom 这将为colorbar创建一个新的轴。执行fig.colorbar(ax=ax, cax=ax)不会创建新的轴,但会创建类似奇怪的图形。我将添加一个示例,展示这个图形的样子。 - C_Z_
3个回答

136

这种技术通常用于图中的多个轴。在这种情况下,通常需要有一个与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()

大小合适的带有色条的图像


93

色标必须有自己的坐标轴。但是,您可以创建一个与之前的坐标轴重叠的坐标轴。然后使用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()

输入图像描述


11

无法将此内容添加为评论,但如果有人有兴趣在使用子图时使用接受的答案,分隔符应该在特定的轴对象上形成(而不是在从plt.subplots返回的numpy.ndarray上形成)

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

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