Matplotlib — то же заполнение, что и в `colorbar`

Есть ли способ сохранить тот же отступ, который используется colorbar, не видя colobar?

Почему ? Действительно, это позволит мне сделать один визуальный эффект при переходе от одного графика без информации о цвете к тому, который использует цветную полосу.

Вот один начальный код из этот пост.

from matplotlib.pylab import *
import matplotlib.cm as cm

min_val = 0
max_val = 1

# See : http://www.scipy.org/Cookbook/Matplotlib/Show_colormaps
my_cmap = cm.get_cmap('jet') # or any other one
norm = matplotlib.colors.Normalize(min_val, max_val) # the color maps work for [0, 1]

cmmapable = cm.ScalarMappable(norm, my_cmap)
cmmapable.set_array(range(min_val, max_val))

figure()
ax = gca()

cbar = colorbar(cmmapable, ticks=[0, 1])
cbar.ax.set_yticklabels(['Min', 'Max'])

show()

person Community    schedule 06.03.2013    source источник
comment
Я не уверен, что вы подразумеваете под информацией о цвете, и я не совсем уверен, что вы пытаетесь сделать? Прямо сейчас у вас есть цветная полоса на рисунке только с 1 осями. Можете ли вы уточнить?   -  person Yann    schedule 06.03.2013
comment
@ Янн, я обновил свой вопрос. Прыжок это яснее... :-)   -  person    schedule 07.03.2013


Ответы (1)


Насколько я понимаю, вы хотите сделать презентацию или около того с двумя слайдами, один с графиком без цветной полосы и следующий слайд с тем же графиком с цветной полосой. Графики на двух слайдах должны иметь одинаковые размеры, чтобы при смене слайдов график не прыгал и не изменялся в размере.

Установка цветовой карты изменит размер исходного экземпляра Axes. Вы можете использовать ax.get_position(), чтобы получить ограничивающую рамку измененного размера Axes. Он возвращает ограничивающую рамку: Bbox(array([[ 0.125, 0.1 ], [ 0.745, 0.9 ]])) Он дает левый, нижний, правый и верхний край. Я считаю, что проще немного схитрить и использовать ax._position.bounds, который дает прямоугольник (левый край, нижний край, ширина, высота), который вы можете напрямую использовать для создания новых осей, как показано ниже.

import matplotlib 
import matplotlib.pyplot as plt

min_val = 0
max_val = 1

my_cmap = matplotlib.cm.get_cmap('jet') 
norm = matplotlib.colors.Normalize(min_val, max_val) 

cmmapable = matplotlib.cm.ScalarMappable(norm, my_cmap)
cmmapable.set_array(range(min_val, max_val))

fig1 = plt.figure()
ax1 = fig1.add_subplot(111)

cbar = plt.colorbar(cmmapable, ax = ax1, ticks=[0, 1])
cbar.ax.set_yticklabels(['Min', 'Max'])

# gives bounding box with left, right, bottom, top
print(ax1.get_position())
# gives rectangle with left, bottom, width, height
print(ax1._position.bounds)

fig2 = plt.figure()
ax2 = fig2.add_axes(ax1._position.bounds)

plt.show()

ОБНОВЛЕНИЕ: в приведенном выше решении нет цветной полосы, в приведенном ниже решении есть цветная полоса, но вы делаете ее белой и удаляете метки и шипы. Если фоновый цвет фигуры не белый, вы увидите белый прямоугольник там, где должна быть цветная полоса.

import matplotlib 
import matplotlib.pyplot as plt

min_val = 0
max_val = 1

my_cmap = matplotlib.cm.get_cmap('jet') 
norm = matplotlib.colors.Normalize(min_val, max_val) 

cmmapable = matplotlib.cm.ScalarMappable(norm, my_cmap)
cmmapable.set_array(range(min_val, max_val))

fig1 = plt.figure()
ax1 = fig1.add_subplot(111)

# set opacity to 0
cbar = plt.colorbar(cmmapable, ax = ax1, ticks=[0, 1], alpha = 0)

# remove the tick labels
cbar.ax.set_yticklabels(['', ''])
# set the tick length to 0
cbar.ax.tick_params(axis = 'y', which = "both", length = 0)

# set everything that has a linewidth to 0
for a in cbar.ax.get_children():
    try:
        a.set_linewidth(0)
    except:
        pass

plt.show()   
person Robbert    schedule 10.03.2013
comment
Здравствуйте, большое спасибо! Это просто работа. Я также хотел бы иметь пустой прямоугольник справа от графика, который имеет ту же ширину, что и тот, который используется для отображения цветовой полосы. Почему ? Это позволит диаграмме без цветовой полосы и графику с ней быть одновременно размещенными в моем ползунке. - person ; 10.03.2013
comment
Это на самом деле проще :) Просто создайте цветовую полосу и установите альфу (непрозрачность) на ноль: cbar = plt.colorbar(cmmapable, ax = ax1, ticks=[0, 1], alpha = 0) Нет необходимости использовать ax1._position.bounds. - person Robbert; 10.03.2013
comment
Проблема с этим решением заключается в том, что легенда и прямоугольник цветной полосы все еще видны. - person ; 10.03.2013