【问题标题】:Positioning the colorbar定位颜色条
【发布时间】:2012-10-29 22:07:17
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    使用填充 pad

    为了相对于子图移动颜色条,可以使用pad 参数到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_ratios 设置为gridspec_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()
    

    【讨论】:

    • 如何使用您的第二个示例将颜色条放在图像顶部?我尝试设置cax = divider.append_axes("top", size="5%", pad=.15),但随后刻度线与图像重叠。我一直试图在answer 之后将其向外放置,但没有成功,因为它是使用非常非正统的matplotlib 对象编写的,我无法在您的示例中重现。
    • 最后一个解决方案(带子图)使收缩参数无用且无效。知道为什么吗?
    • @T.Boutelier 是的,这是意料之中的。 shrink 不适用于外部创建的轴。
    • 好的,谢谢您的回答!那么如何使用此解决方案(子图)控制颜色条的大小?
    • 正确。您将使用 GridSpec。
    【解决方案2】:

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

    三个很好的方法已经分享了@98​​7654321@。

    matplotlib documentation 建议使用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")
    

    【讨论】:

    • 请给出一个可运行的完整示例。
    • 我认为你想要img = ax1.imshow(your_data) 而不是ax1.plot(your_data) 那么最后一行是cb = plt.colorbar(img, cax=cbaxes)
    • 我喜欢这个答案,因为它在我的示例中非常好用。除非我为 colobar 添加标题。那我就看不到了。你能帮忙吗?
    猜你喜欢
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2021-07-06
    相关资源
    最近更新 更多