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 热图彩色图的主要内容,如果未能解决你的问题,请参考以下文章