2015-10-15 8 views
8

Ich benutze Seaborn in Python, um eine Heatmap zu erstellen. Ich kann die Zellen mit den übergebenen Werten annotieren, aber ich möchte Anmerkungen hinzufügen, die bedeuten, was die Zelle bedeutet. Zum Beispiel würde ich, statt nur 0.000000 zu sehen, das entsprechende Etikett sehen, zum Beispiel "Foo" oder 0.000000 (Foo).Benutzerdefinierte Anmerkung Seaborn Heatmap

Die Seaborn documentation für die Heatmap Funktion ist ein wenig kryptisch mit dem Parameter, die ich glaube, dass der Schlüssel hier ist:

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

habe ich versucht, annot_kws zu einem Wörterbuch der Aliase auf die Werte einstellen, das heißt {'Foo' : -0.231049060187, 'Bar' : 0.000000}, usw., aber ich bekomme einen AttributeError.

Hier ist mein Code (Ich habe erstellt manuell die Datenarray hier für Reproduzierbarkeit):

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) 

Hier ist die (Arbeits-) ausgegeben wird, wenn ich nicht die annot_kws Parameter:

Working output

Und hier die Stack-Trace, wenn ich gehören die annot_kws param tun :

--------------------------------------------------------------------------- 
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 

Schließlich kws, das Attribut ich in der Stack-Trace in der Linie bin vorbei, ist das Wörterbuch, und es wäre im Grunde wie folgt aussehen:

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

Hoffnung alles Sinn macht, und ich würde schätze jede Hilfe, die jemand geben kann.

+0

Haben Sie es jemals geschafft, dieses Problem zu lösen? – Tom

+0

Leider nicht .. – Tgsmith61591

Antwort

12

Diese Funktion wurde kürzlich in der aktuellen Version von Seaborn 0.7.1 hinzugefügt.

Von Seaborn update history:

Die annot Parameter heatmap() akzeptiert nun einen rechteckigen Datensatz zusätzlich zu einem booleschen Wert.Wenn ein Datensatz übergeben wird, werden seine Werte für die Annotationen verwendet werden, während der Haupt-Datensatz wird für die Heatmap Zellfarben

Hier ist ein Beispiel

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 = '') 

Hinweis verwendet werden, fmt = '' ist notwendig, wenn Sie nicht-numerische Beschriftungen verwenden, da der Standardwert fmt = '. 2g' ist, was nur für numerische Werte sinnvoll ist und zu einem Fehler bei Textbeschriftungen führen würde. enter image description here

2

aanot_kws in Seaborn einem anderen Zweck dient, bietet nämlich es den Zugriff auf wie Anmerkungen angezeigt werden, anstatt was

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

Danke @bushmanov. Kennen Sie die Annotationen? Oder ist es eine verlorene Sache? – Tgsmith61591

+0

@ Tgsmith61591 Danke für die Annahme. Heatmaps sind Repräsentationen von Werten, daher glaube ich, dass * es keine Wege gibt, die heatmap inhärent sind, die es erlauben würden, nicht existierende Label 'Foo' aus den zugrunde liegenden Daten zu ziehen. Wenn Sie unbedingt ein Etikett anhängen müssen, würde ich auf Matplotlib schauen, wie es Text auf seinen Plots überlagert. Afterall Seaborn ist Matplotlib. –

3

Ich glaube nicht, dies wird angezeigt ist in der aktuellen Version möglich. Wenn Sie bis zu einem Hack-y Abhilfe sind, können Sie folgendes tun ...

# 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) 

Beachten Sie, dass Sie ein Problem mit der Färbung des Textes Etiketten haben. Hier habe ich eine benutzerdefinierte cmap erstellt, um alle Etiketten einheitlich schwarz zu haben.

+0

Das ist, was ich gesucht habe. Könnten Sie ein Beispiel für Ihr benutzerdefiniertes Farbschema hinzufügen? –