Необходимо для imshow зафиксировать размер всей фигуры в условиях меняющейся шкалы в colorbar

При изменении значений на оси z (colorbar) вся итоговая картинка немного дрожит (смещается за счет того, что числа увеличились в своей разрядности). Можно ли как то зафиксировать размер всей картинки? Нужно сохранять в дальнейшем множество таких картин с меняющейся шкалой на colorbar и хочется чтобы положение было фиксировано. П.С.: фиксирование figsize=(3,3) и aspect='auto' дает только постоянный размер самого отображаемого графика, а нужен размер всей сохраняемой картинки без смещения ее положения.


import matplotlib
import matplotlib.pyplot as plt
import numpy as np


array1=np.ones(shape=(50,50))
array2=100*np.ones(shape=(50,50))
# -----------------------------------------------------------------------------
fig1 = plt.figure(figsize=(3, 3))
ax = fig1.add_subplot(111)
cmap = matplotlib.colors.LinearSegmentedColormap.from_list('my_colormap',
                                                ['white','xkcd:bright orange','xkcd:chestnut'],
                                                256)
plt.xlabel('x',fontsize=12)
plt.ylabel('y',fontsize=12)

im=plt.imshow(array1,aspect='auto',cmap = cmap)
cax = fig1.add_axes([ax.get_position().x1+0.01,ax.get_position().y0,0.02,ax.get_position().height])
plt.colorbar(im, cax=cax, shrink=2)
# -----------------------------------------------------------------------------
fig2 = plt.figure(figsize=(3, 3))
ax = fig1.add_subplot(111)
cmap = matplotlib.colors.LinearSegmentedColormap.from_list('my_colormap',
                                                ['white','xkcd:bright orange','xkcd:chestnut'],
                                                256)
plt.xlabel('x',fontsize=12)
plt.ylabel('y',fontsize=12)

im=plt.imshow(array2,aspect='auto',cmap = cmap)
cax = fig2.add_axes([ax.get_position().x1+0.01,ax.get_position().y0,0.02,ax.get_position().height])
plt.colorbar(im, cax=cax, shrink=2)
# -----------------------------------------------------------------------------

plt.show()

Ответы (1 шт):

Автор решения: strawdog

Для начала, я бы советовал вам обратить внимание на библиотеку seaborn и её метод heatmap - это существенно облегчит вам жизнь ;)

Я немного переделал ваш код, потому что он нарушает некоторые регламенты создания холстов - теперь для каждого изображения инициализируется отдельная фигура и отдельные оси на основе фигур.

Как раз оси я и предлагаю вам инициализировать по-другому (обратите внимание на add_axes вместо add_subplot):

import matplotlib
import matplotlib.pyplot as plt
import numpy as np


array1=np.ones(shape=(50,50))
array2=100*np.ones(shape=(50,50))
# -----------------------------------------------------------------------------
fig1 = plt.figure(figsize=(3, 3))
#ax = fig1.add_subplot(111)
ax = fig1.add_axes([0,0,1,1])
cmap = matplotlib.colors.LinearSegmentedColormap.from_list('my_colormap',
                                                ['white','xkcd:bright orange','xkcd:chestnut'],
                                                256)
plt.xlabel('x',fontsize=12)
plt.ylabel('y',fontsize=12)

im=plt.imshow(array1,aspect='equal',cmap = cmap)
cax = fig1.add_axes([ax.get_position().x1+0.01,ax.get_position().y0,0.02,ax.get_position().height])
plt.colorbar(im, cax=cax, shrink=2)
# -----------------------------------------------------------------------------
fig2 = plt.figure(figsize=(3, 3))
#ax1 = fig2.add_subplot(111)
ax1 = fig2.add_axes([0,0,1,1])
cmap = matplotlib.colors.LinearSegmentedColormap.from_list('my_colormap',
                                                ['white','xkcd:bright orange','xkcd:chestnut'],
                                                256)
plt.xlabel('x',fontsize=12)
plt.ylabel('y',fontsize=12)

im=plt.imshow(array2,aspect='equal',cmap = cmap)
cax1 = fig2.add_axes([ax1.get_position().x1+0.01,ax1.get_position().y0,0.02,ax1.get_position().height])
plt.colorbar(im, cax=cax1, shrink=2)
# -----------------------------------------------------------------------------

plt.show()

Тут у меня получается создать два одинаковых по размеру изображения (309х268) введите сюда описание изображения

введите сюда описание изображения

→ Ссылка