Необходимо для 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 шт):
Для начала, я бы советовал вам обратить внимание на библиотеку 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)

