Изменить размер объекта matplotlib в ячейке gridspec (размеры matshow и colorbar не совпадают)

Объекты matshow и colorbar не заполняют одно и то же пространство внутри ячеек gridspec и поэтому имеют разную высоту.

Обычно я бы использовал аргумент «сжать» цветовой панели, но это, похоже, не работает, когда оно вложено в объект gridspec.

Как я могу уменьшить объект colorbar без изменения размера тепловой карты matshow?

заранее спасибо

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import gridspec

df = pd.DataFrame((np.random.randint(0, 3, 10000).reshape(100, 100)))
fig = plt.figure(figsize=(15,15))
gs = gridspec.GridSpec(10, 10)

#### other axes removed for simplicity

ax2 = fig.add_subplot(gs[2:,:8])

# plot heatmap
cax = ax2.matshow(df, interpolation='nearest', cmap=plt.cm.YlGn, aspect='equal')
ax2.set_xticks([])
ax2.set_yticks([])

ax3 = fig.add_subplot(gs[2:,8])

fig.colorbar(cax, cax=ax3)

plt.tight_layout()
gs.update(wspace=2, hspace=0.1)
plt.show()

matshow и colorbar немного (раздражающе) отличаются по высоте

РЕДАКТИРОВАТЬ: Аннотированное изображение для пояснения

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


person JoshuaBox    schedule 26.07.2016    source источник
comment
Тепловая карта и цветная полоса «разной высоты». На вашем прикрепленном изображении они кажутся мне одинакового роста. Можете ли вы уточнить, что вы имеете в виду?   -  person DavidG    schedule 26.07.2016
comment
Они действительно близки, но не совсем то же самое! Я добавил еще одно изображение, чтобы уточнить   -  person JoshuaBox    schedule 26.07.2016


Ответы (1)


Вы можете использовать matplotlib AxesDivider. Ниже приведен пример использования данных из вашего вопроса:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import gridspec

fig = plt.figure(figsize=(15,15))
df = pd.DataFrame((np.random.randint(0, 3, 10000).reshape(100, 100)))
gs = gridspec.GridSpec(10, 10)
ax2 = fig.add_subplot(gs[2:,:8])

im = ax2.matshow(df,interpolation='nearest',cmap=plt.cm.YlGn, aspect='equal')

divider = make_axes_locatable(ax2)
cax = divider.append_axes("right", size="5%", pad=0.05)

plt.colorbar(im, cax=cax)
plt.show()

Это дает следующий график, который, на мой взгляд, выглядит так, как будто они одного размера:

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

person DavidG    schedule 26.07.2016
comment
Большое спасибо! Как раз то, что мне было нужно - person JoshuaBox; 26.07.2016