2015-10-15 11 views
8

Я использую Seaborn в Python для создания карты Heatmap. Я могу аннотировать ячейки со значениями, переданными в, но я хотел бы добавить аннотации, которые означают, что означает ячейка. Например, вместо того, чтобы просто видеть 0.000000, я бы хотел увидеть соответствующую метку, например «Foo», или 0.000000 (Foo).Custom Annotation Seaborn Heatmap

Seaborn documentation для функции Heatmap немного загадочный с параметром, который я считаю, является ключевым здесь:

annot_kws : dict of key, value mappings, optional 
    Keyword arguments for ax.text when annot is True. 

Я попытался установить annot_kws в словарь псевдонимов значений, т.е. {'Foo' : -0.231049060187, 'Bar' : 0.000000}, и т. д., но я получаю атрибут AttributeError.

Вот мой код (я вручную создал массив данных здесь для воспроизводимости):

data = np.array([[0.000000,0.000000],[-0.231049,0.000000],[-0.231049,0.000000]]) 
axs = sns.heatmap(data, vmin=-0.231049, vmax=0, annot=True, fmt='f', linewidths=0.25) 

Вот является (рабочий) выход, когда я не использую annot_kws параметр:

Working output

А вот трассировки стека, когда я сделать включают annot_kws параметров:

--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-57-38f91f1bb4b8> in <module>() 
    12 
    13 
---> 14 axs = sns.heatmap(data, vmin=min(uv), vmax=max(uv), annot=True, annot_kws=kws, linewidths=0.25) 
    15 concepts 

/opt/anaconda/2.3.0/lib/python2.7/site-packages/seaborn/matrix.pyc in heatmap(data, vmin, vmax, cmap, center, robust, annot, fmt, annot_kws, linewidths, linecolor, cbar, cbar_kws, cbar_ax, square, ax, xticklabels, yticklabels, mask, **kwargs) 
    272  if square: 
    273   ax.set_aspect("equal") 
--> 274  plotter.plot(ax, cbar_ax, kwargs) 
    275  return ax 
    276 

/opt/anaconda/2.3.0/lib/python2.7/site-packages/seaborn/matrix.pyc in plot(self, ax, cax, kws) 
    170   # Annotate the cells with the formatted values 
    171   if self.annot: 
--> 172    self._annotate_heatmap(ax, mesh) 
    173 
    174   # Possibly add a colorbar 

/opt/anaconda/2.3.0/lib/python2.7/site-packages/seaborn/matrix.pyc in _annotate_heatmap(self, ax, mesh) 
    138    val = ("{:" + self.fmt + "}").format(val) 
    139    ax.text(x, y, val, color=text_color, 
--> 140      ha="center", va="center", **self.annot_kws) 
    141 
    142  def plot(self, ax, cax, kws): 

/opt/anaconda/2.3.0/lib/python2.7/site-packages/matplotlib/axes/_axes.pyc in text(self, x, y, s, fontdict, withdash, **kwargs) 
    590   if fontdict is not None: 
    591    t.update(fontdict) 
--> 592   t.update(kwargs) 
    593   self.texts.append(t) 
    594   t._remove_method = lambda h: self.texts.remove(h) 

/opt/anaconda/2.3.0/lib/python2.7/site-packages/matplotlib/artist.pyc in update(self, props) 
    755    func = getattr(self, 'set_' + k, None) 
    756    if func is None or not six.callable(func): 
--> 757     raise AttributeError('Unknown property %s' % k) 
    758    func(v) 
    759    changed = True 

AttributeError: Unknown property tokenized 

Наконец, kws атрибут я передаю в строке в трассировке стека, это словарь, и это будет выглядеть в основном так:

kws = {'Foo': -0.231049060187, 'Bar': 0.0} 

Надежда все имеет смысл, и я бы оцените любую помощь, которую любой может дать.

+0

Вам удалось решить эту проблему? – Tom

+0

К сожалению, нет .. – Tgsmith61591

ответ

12

Эта функция была добавлена ​​в недавнюю версию Seaborn 0.7.1.

От Seaborn update history:

ANNOT параметр тепловой карты() теперь принимает прямоугольный набор данных в дополнение к логическому значению.Если набор данных передается, ее значения будут использоваться для аннотации, в то время как основной набор данных будет использоваться для Heatmap клеточных цветов

Ниже приведен пример

data = np.array([[0.000000,0.000000],[-0.231049,0.000000],[-0.231049,0.000000]]) 
labels = np.array([['A','B'],['C','D'],['E','F']]) 
fig, ax = plt.subplots() 
ax = sns.heatmap(data, annot = labels, fmt = '') 

Примечание, FMT = '' необходимо, если вы используете нечисловые метки, поскольку значение по умолчанию - fmt = '. 2g', что имеет смысл только для числовых значений и приведет к ошибке для текстовых меток. enter image description here

2

aanot_kws в Сиборн служит другой цели, а именно, он обеспечивает доступ к , как отображаются аннотаций, а не , что отображается

import matplotlib.pyplot as plt 
import seaborn as sns 

sns.set() 
fig, ax = plt.subplots(1,2) 
ata = np.array([[0.000000,0.000000],[-0.231049,0.000000],[-0.231049,0.000000]]) 
sns.heatmap(data, vmin=-0.231049, vmax=0, annot=True, fmt='f', annot_kws={"size": 15}, ax=ax[0]) 
sns.heatmap(data, vmin=-0.231049, vmax=0, annot=True, fmt='f', annot_kws={"size": 10}, ax=ax[1]); 

enter image description here

+0

Спасибо @bushmanov. Вы знаете, как изменить аннотации? Или это потерянное дело? – Tgsmith61591

+0

@ Tgsmith61591 Спасибо за принятие. Heatmaps - это представления значений, поэтому я сильно * верю *, нет никаких способов, которые могут быть использованы для нагрева, что позволило бы вытащить несуществующую метку 'Foo' из базовых данных. Если вам обязательно нужно прикрепить ярлык, я бы посмотрел на matplotlib, как он накладывает текст на свои сюжеты. После того, как весь морской берег является matplotlib. –

3

Я не верю в это возможно в текущей версии. Если вы до хак-у обходного пути, вы можете сделать следующее ...

# Create the 1st heatmap without labels 
sns.heatmap(data=df1, annot=False,) 

# create the second heatmap, which contains the labels, 
# turn the annotation on, 
# and make it transparent 
sns.heatmap(data=df2, annot=True, alpha=0.0) 

Обратите внимание, что вы можете иметь проблемы с окраской текстовых меток. Здесь я создал обычай cmap, чтобы все метки были равномерно черными.

+0

Это то, что я искал. Не могли бы вы добавить пример своей пользовательской цветовой схемы? –

Смежные вопросы