почему изменение размера осей работает по-разному внутри и снаружи функции? - PullRequest
0 голосов
/ 28 июня 2019

Я работаю с существующим кодом, который создает фигуру matplotlib с одной осью и добавляет к ней цветовую полосу, используя make_axes_locatable и append_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

Если сначала создать фигуру, то уменьшитьПосле факта цветовой шкалы он работает так, как я хочу , если эти строки запускаются отдельно (либо в обычном Python REPL с plt.ion(), либо если каждая строка находится в отдельной ячейке iPython):

fig = make_figure(data, shrink=False)
cax = fig.axes[-1]
shrink_colorbar(cax)

ПРАВИЛЬНЫЙ РЕЗУЛЬТАТ:

figure with correctly resized colorbar

Если эти же строки выполняются как одна ячейка iPython,или если запустить с plt.ioff() в обычном REPL Python и затем plt.show(), я получу тот же плохой результат, что и в первом примере выше (с shrink=True во внешней функции).

Как я могу получить правильный результат, все еще делая изменение размера цветовой панели внутри функции (а не в пользовательском пространстве)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...