Сопоставьте размер горизонтальной цветной полосы с шириной квадратной тепловой карты в Seaborn.

Я хочу создать квадратную тепловую карту в Seaborn с цветовой полосой ниже. Вот код, который я использую:

#!/usr/bin/env python3

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

data = np.random.rand(5,4)

grid_kws = {"height_ratios": (.9, .05), "hspace": .5}
f, (ax, cbar_ax) = plt.subplots(2, gridspec_kw=grid_kws)

ax = sns.heatmap(data,
                 ax=ax,
                 cbar_ax=cbar_ax,
                 annot=True,
                 square=True,
                 cbar_kws={ "orientation": "horizontal" })

plt.savefig("heatmap.png")

И вот результат: output

Как я могу сопоставить размер цветовой полосы с размером тепловой карты?


person Filippo Bistaffa    schedule 28.05.2018    source источник


Ответы (1)


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

используя подсюжеты

Можно напрямую создать две строки подграфиков, одну для изображения и одну для цветной полосы, как это делается в вопросе, нужно просто убедиться, что размер фигуры сжимает график по горизонтали, а не по вертикали. В этом случае попробуйте figsize=(3,5).

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

data = np.random.rand(5,4)

grid_kws = {"height_ratios": (.9, .05), "hspace": .5}
fig, (ax, cbar_ax) = plt.subplots(2, figsize=(3,5), gridspec_kw=grid_kws)

ax = sns.heatmap(data,
                 ax=ax,
                 cbar_ax=cbar_ax,
                 annot=True,
                 square=True,
                 cbar_kws={ "orientation": "horizontal" })

#plt.savefig("heatmap.png")
plt.show()

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

с помощью делителя осей

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable

data = np.random.rand(5,4)

fig, ax = plt.subplots()

divider = make_axes_locatable(ax)
cbar_ax = divider.new_vertical(size="5%", pad=0.5, pack_start=True)
fig.add_axes(cbar_ax)
ax = sns.heatmap(data,
                 ax=ax,
                 cbar_ax=cbar_ax,
                 annot=True,
                 square=True,
                 cbar_kws={ "orientation": "horizontal" })


#plt.savefig("heatmap.png")
plt.show()

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

person ImportanceOfBeingErnest    schedule 28.05.2018
comment
Спасибо, второе решение сработало отлично. Первый вызывал проблемы чрезмерной обрезки при добавлении метки по оси Y слева. - person Filippo Bistaffa; 29.05.2018