为什么更改轴的大小在函数内部和外部的作用不同?

时间:2019-06-27 22:21:49

标签: matplotlib colorbar

我正在使用现有代码创建一个带有一个轴的matplotlib图形,然后使用make_axes_locatableappend_axes在其后添加颜色栏。它有效,但是我想随后更改颜色条的垂直高度。我发现只有在色标轴上调用set_axes_locator(None)方法时才有可能(不能100%确定原因)---如果不这样做,则任何对cax.set_position()的调用默默无所事事。这是设置;问题如下:

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

data = np.random.randint(4, size=(5, 7))


def make_figure(data, shrink):
    fig, ax = plt.subplots()
    ax.imshow(data)
    divider = make_axes_locatable(ax)
    cax = divider.append_axes('right', size='5%', pad=0.1)
    cmap = ax.images[0].get_cmap()
    _ = ColorbarBase(cax, cmap=cmap, norm=None, orientation='vertical')
    if shrink:
        shrink_colorbar(cax)
    return fig


def shrink_colorbar(cax):
    pos = cax.get_position().bounds
    new_height = pos[-1] - 0.4
    new_y = pos[1] + 0.2
    newpos = (pos[0], new_y, pos[2], new_height)
    cax.set_axes_locator(None)
    cax.set_position(newpos)

如果我在创建图形的函数环境中在 中调整颜色条的大小,则无论使用常规的Python REPL还是使用iPython,每次都会得到错误的结果:

make_figure(data, shrink=True)

错误结果:

figure with unexpectedly wide colorbar, obscuring the main plot

如果我先创建图形,然后再缩小颜色栏,那么只要这些行分别运行(在带有{{1的常规Python REPL中, }},或者如果每一行都在单独的iPython单元格中):

plt.ion()

正确的结果:

figure with correctly resized colorbar

如果这些相同的行作为单个iPython单元运行,或者在常规Python REPL中以fig = make_figure(data, shrink=False) cax = fig.axes[-1] shrink_colorbar(cax) 运行,然后以plt.ioff()运行,则我得到的错误结果与上述第一个示例相同(在外部函数中使用plt.show())。

如何在仍在函数内部调整颜色栏大小(而不是在用户区中)的同时获得正确的结果?

0 个答案:

没有答案