seaborn 热图彩色图

Posted

技术标签:

【中文标题】seaborn 热图彩色图【英文标题】:seaborn heatmap color map 【发布时间】:2021-04-14 14:06:36 【问题描述】:

我有一个数据框 df,其值从 0 到 x(x 是整数,没有固定值),在我的示例中是 x=10

我想用 cmap 'Reds' 映射热图,但是值 0 不应该是白色,而是绿色 '#009933'

import seaborn as sns # matplotlib inline 
import random
data = []
for i in range(10):
    data.append([random.randrange(0, 11, 1) for _ in range(10)])
df = pd.DataFrame(data)

fig, ax = plt.subplots(figsize = (12, 10)) 
# cmap = [????]
ax = sns.heatmap(df, cmap='Reds', linewidths = 0.005, annot = True, cbar=True) 
                            
plt.show()

我该怎么做?

【问题讨论】:

近期:seaborn don't give color in heatmap if cell value is higher than 0.05 【参考方案1】:

您可以使用matplotlib.colors 中的LinearSegmentedColormap。您首先必须找到最大值,在本例中为 10,然后使用它创建一个以绿色开头的颜色变量,然后转到标准的“红色”颜色集。另外,使用 seaborn 制作热图时将 colorbar 设置为 False,并使用 matplotlib 单独制作。

这段代码改编自here:

import matplotlib.pyplot as plt
import matplotlib.colors as cl
import seaborn as sns
import pandas as pd
import numpy as np
import random

data = []
for i in range(10):
    data.append([random.randrange(0, 11, 1) for _ in range(10)])
df = pd.DataFrame(data)

fig, ax = plt.subplots(figsize = (12, 10)) 
cmap_reds = plt.get_cmap('Reds')
num_colors = 11
colors = ['#009933'] + [cmap_reds(i / num_colors) for i in range(1, num_colors)]
cmap = cl.LinearSegmentedColormap.from_list('', colors, num_colors)
ax = sns.heatmap(df, cmap=cmap, vmin=0, vmax=num_colors, square=True, cbar=False, annot = True)
cbar = plt.colorbar(ax.collections[0], ticks=range(num_colors + 1))
cbar.set_ticks(np.linspace(0, num_colors, 2*num_colors+1)[1::2])
cbar.ax.set_yticklabels(range(num_colors))
plt.show()

这是输出:

【讨论】:

@JohanC 啊,我看到了不错的收获!我将编辑我的答案! 要让颜色条在每个单元格的中心打勾,你可以试试cbar.set_ticks(np.linspace(0, num_colors, 2*num_colors+1)[1::2]); cbar.ax.set_yticklabels(range(num_colors)) @JohanC 用您评论中的代码更新了我的答案。【参考方案2】:

作为accepted answer 的替代方案,您还可以将vmin 设置为略高于0,并使用set_under 定义超出范围值的颜色:

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

cmap = copy.copy(plt.get_cmap("Reds"))
cmap.set_under('#009933')
sns.heatmap(np.random.randint(0,10,(10,10)), cmap=cmap, lw=0.005, annot=True, vmin=1e-5)

under-color 默认不显示在颜色栏中。要更改颜色条,请使用例如 sns.heatmap(..., cbar_kws='extend':'min', 'extendrect':True)。这些参数的解释可以参考colorbar docs。

【讨论】:

您可以使用cbar_kw='extend':'min', 'extendrect':'True 来显示底色。参见例如seaborn don't give color in heatmap if cell value is higher than 0.05 @Stef SO 不允许我在 5 分钟后编辑 cmets。无论如何,SO更喜欢答案更加独立,所以我更新了你的答案。 @JohanC 啊,我明白了。我只是想给你应有的信任。非常感谢您的编辑!

以上是关于seaborn 热图彩色图的主要内容,如果未能解决你的问题,请参考以下文章

更改seaborn热图的轴标签[重复]

如何为 seaborn 的热图或相关矩阵设置动画?

具有二进制颜色编码和原始输入注释的 seaborn 热图

Seaborn 热图阴谋失败

自定义注释 Seaborn 热图

Seaborn 热图相关性不适合注释数字