Я работаю с существующим кодом, который создает фигуру 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)
НЕПРАВИЛЬНЫЙ РЕЗУЛЬТАТ:
Если сначала создать фигуру, то уменьшитьПосле факта цветовой шкалы он работает так, как я хочу , если эти строки запускаются отдельно (либо в обычном Python REPL с plt.ion()
, либо если каждая строка находится в отдельной ячейке iPython):
fig = make_figure(data, shrink=False)
cax = fig.axes[-1]
shrink_colorbar(cax)
ПРАВИЛЬНЫЙ РЕЗУЛЬТАТ:
Если эти же строки выполняются как одна ячейка iPython,или если запустить с plt.ioff()
в обычном REPL Python и затем plt.show()
, я получу тот же плохой результат, что и в первом примере выше (с shrink=True
во внешней функции).
Как я могу получить правильный результат, все еще делая изменение размера цветовой панели внутри функции (а не в пользовательском пространстве)?