2015-10-15 21 views
8

Tôi đang sử dụng Seaborn in Python để tạo bản đồ nhiệt. Tôi có thể chú thích các ô với các giá trị được truyền vào, nhưng tôi muốn thêm các chú thích biểu thị ý nghĩa của ô. Ví dụ: thay vì chỉ nhìn thấy 0.000000, tôi muốn xem nhãn tương ứng, ví dụ: "Foo" hoặc 0.000000 (Foo).Chú thích tùy chỉnh Seaborn Heatmap

Các Seaborn documentation cho hàm Heatmap là một chút khó hiểu với tham số mà tôi tin là chìa khóa ở đây:

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

tôi đã cố gắng thiết lập annot_kws để một cuốn từ điển của các bí danh đến các giá trị, tức là, {'Foo' : -0.231049060187, 'Bar' : 0.000000}, v.v. nhưng tôi nhận được AttributeError.

Đây là mã của tôi (Tôi đã tự tạo ra các mảng dữ liệu vào đây để reproducability):

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) 

Đây là (làm việc) đầu ra khi tôi không sử dụng các annot_kws tham số:

Working output

Và đây stack trace cho khi tôi làm bao gồm annot_kws param:

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

Cuối cùng, kws, thuộc tính Tôi đang đi qua trong dòng trong ngăn xếp dấu vết, là từ điển và nó sẽ trông cơ bản như thế này:

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

Hope tất cả mọi thứ có ý nghĩa, và tôi muốn đánh giá cao bất kỳ sự giúp đỡ nào mà mọi người có thể cung cấp

+0

Bạn đã bao giờ quản lý để giải quyết vấn đề này chưa? – Tom

+0

Thật không may .. – Tgsmith61591

Trả lời

12

Tính năng này vừa được thêm vào trong phiên bản gần đây của Seaborn 0.7.1.

Từ Seaborn update history:

Các ANNOT tham số của Heatmap() bây giờ chấp nhận một tập dữ liệu hình chữ nhật, thêm vào một giá trị boolean.Nếu một tập dữ liệu được truyền, giá trị của nó sẽ được sử dụng cho các chú thích, trong khi số liệu chính sẽ được sử dụng cho các màu sắc tế bào Heatmap

Dưới đây là một ví dụ

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

Note, fmt = '' là cần thiết nếu bạn đang sử dụng nhãn không phải số, vì giá trị mặc định là fmt = '. 2g' chỉ có ý nghĩa đối với giá trị số và sẽ dẫn đến lỗi cho nhãn văn bản. enter image description here

2

aanot_kws trong sanh ở biển phục vụ một mục đích khác nhau, cụ thể là, nó cung cấp quyền truy cập vào cách chú thích được hiển thị, chứ không phải là những gì được hiển thị

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

Cảm ơn @bushmanov. Bạn có biết cách thay đổi chú thích nào không? Hay đó là một nguyên nhân bị mất? – Tgsmith61591

+0

@ Tgsmith61591 Cảm ơn bạn đã chấp nhận. Bản đồ nhiệt là đại diện của các giá trị, vì vậy tôi mạnh mẽ * tin rằng * không có cách nào thực chất cho bản đồ nhiệt sẽ cho phép kéo nhãn không tồn tại 'Foo' khỏi dữ liệu cơ bản. Nếu bạn chắc chắn cần phải đính kèm một nhãn, tôi sẽ xem matplotlib cách nó phủ lên văn bản trên các ô của nó. Afterall seaborn là matplotlib. –

3

Tôi không tin điều này có thể trong phiên bản hiện tại. Nếu bạn đang lên đến một giải pháp hack-y, bạn có thể làm như sau ...

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

Lưu ý rằng bạn có thể gặp vấn đề với màu của nhãn văn bản. Ở đây, tôi đã tạo một tùy chỉnh cmap để có tất cả các nhãn đồng đều màu đen.

+0

Đây là những gì tôi đang tìm kiếm. Bạn có thể thêm một ví dụ về bảng màu tùy chỉnh của mình không? –

Các vấn đề liên quan