【问题标题】:Assign specific color to seaborn heatmap为 seaborn 热图分配特定颜色
【发布时间】:2020-12-03 03:45:42
【问题描述】:

我正在尝试使用 seaborn 制作热图,但无法更改特定值的颜色。假设值 0 应该是白色,值 1 应该是灰色,然后使用 cmap 提供的调色板。

试图使用面具,但感到困惑。

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

df = pd.read_csv('/home/test.csv', index_col=0)

fig, ax = plt.subplots()
sns.heatmap(df, cmap="Reds", vmin=0, vmax=15)
plt.show()

这是样本数据

TAG     A   B   C   D   E   F   G   H   I   J
TAG_1   1   0   0   5   0   7   1   1   0   10
TAG_2   0   1   0   6   0   6   0   0   0   7
TAG_3   0   1   0   2   0   4   0   0   1   4
TAG_4   0   0   0   3   1   3   0   0   0   10
TAG_5   1   0   1   5   0   2   1   1   0   11
TAG_6   0   0   0   0   0   0   0   0   0   12
TAG_7   0   1   0   0   1   0   0   0   0   0
TAG_8   0   0   0   1   0   0   1   0   1   0
TAG_9   0   0   1   0   0   0   0   0   0   0
TAG_10  0   0   0   0   0   0   0   0   0   0

【问题讨论】:

    标签: seaborn heatmap


    【解决方案1】:

    df.set_index('TAG', inplace=True) 告诉 seaborn 标签应该用作标签,而不是数据。

    “二进制”颜色图从较低值的白色平滑过渡到最高值的深黑色。使用vminvmax,将vmin=0vmax 设置为1.5 到5 之间的值,值0 将是白色,1 将是任何所需的灰色类型。

    要设置掩码,数据帧应转换为 2D numpy 数组并为浮点类型。

    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    from io import StringIO
    
    data_str = StringIO('''TAG     A   B   C   D   E   F   G   H   I   J
    TAG_1   1   0   0   5   0   7   1   1   0   10
    TAG_2   0   1   0   6   0   6   0   0   0   7
    TAG_3   0   1   0   2   0   4   0   0   1   4
    TAG_4   0   0   0   3   1   3   0   0   0   10
    TAG_5   1   0   1   5   0   2   1   1   0   11
    TAG_6   0   0   0   0   0   0   0   0   0   12
    TAG_7   0   1   0   0   1   0   0   0   0   0
    TAG_8   0   0   0   1   0   0   1   0   1   0
    TAG_9   0   0   1   0   0   0   0   0   0   0
    TAG_10  0   0   0   0   0   0   0   0   0   0''')
    
    df = pd.read_csv(data_str, delim_whitespace=True)
    df.set_index('TAG', inplace=True)
    values = df.to_numpy(dtype=float)
    ax = sns.heatmap(values, cmap='Reds', vmin=0, vmax=15, square=True)
    sns.heatmap(values, xticklabels=df.columns, yticklabels=df.index,
                cmap=plt.get_cmap('binary'), vmin=0, vmax=2, mask=values > 1, cbar=False, ax=ax)
    plt.show()
    

    或者,可以创建自定义颜色图。这样,颜色栏也会显示调整后的颜色。

    from matplotlib.colors import LinearSegmentedColormap
    
    cmap_reds = plt.get_cmap('Reds')
    num_colors = 15
    colors = ['white', 'grey'] + [cmap_reds(i / num_colors) for i in range(2, num_colors)]
    cmap = LinearSegmentedColormap.from_list('', colors, num_colors)
    ax = sns.heatmap(df, cmap=cmap, vmin=0, vmax=num_colors, square=True, cbar=False)
    cbar = plt.colorbar(ax.collections[0], ticks=range(num_colors + 1))
    plt.show()
    

    【讨论】:

    • 效果很好,也谢谢set_index的解释。
    • 这很好。请注意,第二个示例需要以下内容才能工作:from matplotlib.colors import LinearSegmentedColormap
    • @ollerend 感谢您发现这一点。我更新了帖子。
    猜你喜欢
    • 2020-10-21
    • 2019-02-22
    • 2018-05-09
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2021-07-06
    • 2020-06-21
    • 1970-01-01
    相关资源
    最近更新 更多