Любой способ изменить цветную полосу (cbar) в Seaborn на легенду (для бинарной тепловой карты)? - PullRequest
0 голосов
/ 17 сентября 2018

Я использую тепловую карту в seaborn (sns.heatmap), чтобы показать матрицу двоичных значений true / false.Это работает просто отлично, но цветная полоса, как и ожидалось, показывает диапазон значений от 0 до 1 (когда в действительности есть только два цвета).

Есть ли способ изменить это на легенду, показывающую истинные / ложные цвета?Я не смог найти ничего в документации

https://seaborn.pydata.org/generated/seaborn.heatmap.html

Пример:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

df = pd.DataFrame({'a':[False,True,False,True,True,True],
                   'b':[False,False,False,False,True,False],
                   'c':[False,True,True,False,True,True],
                   'd':[False,True,False,True,True,True],
                   'e':[False,True,True,False,False,True],
                   'f':[False,True,False,False,True,True]})


# Set up the matplotlib figure
f, ax = plt.subplots(figsize=(13, 13))

# Generate a custom diverging colormap
cmap = sns.diverging_palette(300, 180, as_cmap=True)

# Draw the heatmap with the mask and correct aspect ratio
_ = sns.heatmap(df, cmap=cmap, center=0, square=True, linewidths=.5, cbar_kws={"shrink": .5})

1 Ответ

0 голосов
/ 17 сентября 2018

Вот решение, использующее некоторые случайные данные (работайте над этим до того, как вы включите данные в свое сообщение).Решение было адаптировано для решения вашей проблемы из этой ссылки.

from matplotlib.colors import LinearSegmentedColormap
import numpy as np
import random
import seaborn as sns
sns.set()

# Generate data
uniform_data = np.array([random.randint(0, 1) for _ in range(120)]).reshape((10, 12))

# Define colors
colors = ((1.0, 1.0, 0.0), (1, 0.0, 1.0))
cmap = LinearSegmentedColormap.from_list('Custom', colors, len(colors))

ax = sns.heatmap(uniform_data, cmap=cmap)

# Set the colorbar labels
colorbar = ax.collections[0].colorbar
colorbar.set_ticks([0.25,0.75])
colorbar.set_ticklabels(['0', '1'])

Выход

enter image description here

Применение к вашей проблеме:

# Set up the matplotlib figure
f, ax = plt.subplots(figsize=(8, 8))

colors = ["gray", "lightgray"] 
cmap = LinearSegmentedColormap.from_list('Custom', colors, len(colors))


# Draw the heatmap with the mask and correct aspect ratio
_ = sns.heatmap(df, cmap=cmap,square=True,  linewidths=.5, cbar_kws={"shrink": .5})

# Set the colorbar labels
colorbar = ax.collections[0].colorbar
colorbar.set_ticks([0.25,0.75])
colorbar.set_ticklabels(['0', '1'])

Выход

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...