【问题标题】:Add colorbar to existing axis将颜色条添加到现有轴
【发布时间】:2020-05-05 19:18:09
【问题描述】:

我正在制作一些交互式绘图,我想添加一个颜色条图例。我不希望颜色条位于它自己的轴上,所以我想将它添加到现有的轴上。我在执行此操作时遇到了困难,因为我发现的大多数示例代码都为颜色条创建了一个新轴。

我使用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)

假设我想让颜色条位于左上角,大约在绘图顶部的一半处延伸。我该怎么做呢?

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

【问题讨论】:

  • 我没有答案。但是,为什么要让颜色条成为现有轴的一部分,而不是给它一个新轴?
  • @tnknepp 我正在使用缩放/平移、打开和关闭绘图等来制作交互式绘图。我不必为颜色条创建新轴会更容易跨度>
  • 你为什么不能直接使用fig.colorbar(ax=ax)
  • @tom 这会为颜色条创建一个新轴。执行 fig.colorbar(ax=ax, cax=ax) 不会创建新轴,但会创建类似的奇怪图。我将添加一个情节的示例

标签: python matplotlib


【解决方案1】:

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

【讨论】:

  • 当轴包含底图时,此方法解决了我的问题(上一个答案拉伸了底图)。谢谢!
  • 我找这个太久了!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    无法将此添加为评论,但如果有人有兴趣将已接受的答案与子图一起使用,则应在特定轴对象上形成分隔线(而不是在从 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()
    

    【讨论】:

    • 感谢分享!到处都在寻找这个解决方案!
    猜你喜欢
    • 2016-06-07
    • 2021-08-14
    • 2016-06-22
    • 2020-11-13
    • 2014-01-12
    • 2022-12-12
    • 2017-12-23
    • 2016-09-16
    • 1970-01-01
    相关资源
    最近更新 更多