【问题标题】:matplotlib: shorten a colorbar by half when the colorbar is created using axes_grid1matplotlib:使用 axes_grid1 创建颜色条时将颜色条缩短一半
【发布时间】:2018-09-09 14:56:47
【问题描述】:

我正在尝试将颜色条缩短一半。有谁知道如何做到这一点?我尝试了cax.get_position(),然后是cax.set_position(),但是这个方法不起作用。

此外,axes_grid1 创建的轴似乎与原始轴具有相同的 bbox 位置。这是一个错误吗?

PS。我必须使用axes_grid1来创建colorbar轴,因为之后我需要使用tight_layout(),而tight_layout()只适用于axes_grid1创建的轴,而不适用于add_axes()创建的轴。

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
import numpy as np
plt.figure()
ax = plt.gca()
im = ax.imshow(np.arange(100).reshape((10,10)))
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.05)
bbox1 = ax.get_position()
print(bbox1)
bbox1 = cax.get_position()
print(bbox1)
plt.colorbar(im, cax=cax)
plt.show()

【问题讨论】:

    标签: matplotlib colorbar


    【解决方案1】:

    axes_divider 的全部意义在于划分轴以为新轴腾出空间。这确保了所有轴具有相同的包围盒。这就是您看到的正在打印的框。

    在图中的某个位置创建颜色条的一些常用方法显示在this question 中。这里的问题似乎是能够调用tight_layout。这可以通过以下两个选项来实现。 (可能还有其他人。)

    A.使用网格规范

    我不太确定这里的确切要求,但似乎使用普通的网格布局会更符合您的需要。

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.gridspec as gridspec
    
    fig = plt.figure()
    gs = gridspec.GridSpec(2, 2, width_ratios=[95,5],)
    
    ax = fig.add_subplot(gs[:, 0])
    
    im = ax.imshow(np.arange(100).reshape((10,10)))
    
    cax = fig.add_subplot(gs[1, 1])
    fig.colorbar(im, cax=cax, ax=ax)
    plt.tight_layout()
    plt.show()
    

    B.使用axes_grid1

    如果你真的需要使用axes_grid1,它可能会变得有点复杂。

    import matplotlib.pyplot as plt
    import matplotlib.axes
    from mpl_toolkits.axes_grid1 import make_axes_locatable, Size
    import numpy as np
    
    fig, ax = plt.subplots()
    
    im = ax.imshow(np.arange(100).reshape((10,10)))
    
    divider = make_axes_locatable(ax)
    
    pad = 0.03
    pad_size = Size.Fraction(pad, Size.AxesY(ax))
    
    xsize = Size.Fraction(0.05, Size.AxesX(ax))
    ysize = Size.Fraction(0.5-pad/2., Size.AxesY(ax))
    
    divider.set_horizontal([Size.AxesX(ax), pad_size, xsize])
    divider.set_vertical([ysize, pad_size, ysize])
    
    ax.set_axes_locator(divider.new_locator(0, 0, ny1=-1))
    
    
    cax = matplotlib.axes.Axes(ax.get_figure(),
                     ax.get_position(original=True))
    locator = divider.new_locator(nx=2, ny=0)
    cax.set_axes_locator(locator)
    
    fig.add_axes(cax)
    
    fig.colorbar(im, cax=cax)
    
    plt.tight_layout()
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-07
      • 2017-01-28
      • 2019-04-21
      • 2017-07-16
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多