Насколько я понимаю, вы хотите сделать презентацию или около того с двумя слайдами, один с графиком без цветной полосы и следующий слайд с тем же графиком с цветной полосой. Графики на двух слайдах должны иметь одинаковые размеры, чтобы при смене слайдов график не прыгал и не изменялся в размере.
Установка цветовой карты изменит размер исходного экземпляра 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