如何在 matplotlib 中生成分层颜色图?

问题描述 投票:0回答:1

我有一个分层数据集,我希望以这种方式可视化。我已经能够为其构建热图。

enter image description here

我想在 matplotlib 中生成一个颜色图,以便

Level 1
获得分类颜色,而
Level 2
获得不同色调的
Level 1
颜色。我能够从“tab20”调色板中获取
Level 1
颜色,但我不知道如何生成基本
Level 1
颜色的阴影。

编辑: 需要明确的是,这需要是一个通用脚本。所以我无法对颜色图进行硬编码。

MWE

目前这只是根据 1 级值创建一个颜色图。我不知道如何生成 2 级颜色的阴影:

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

df = pd.DataFrame({"Level 2": [4, 5, 6, 6, 7], "Level 1": [0, 0, 1, 1, 1]}).T

colours = mpl.colormaps["tab20"].resampled(len(df.loc["Level 1"].unique())).colors

colour_dict = {
    item: colour for item, colour in zip(df.loc["Level 1"].unique(), colours)
}

sns.heatmap(
    df,
    cmap=mpl.colors.ListedColormap([colour_dict[item] for item in colour_dict.keys()]),
)
colours

在此示例中,4 和 5 应该是 0 和 6 的颜色深浅,7 应该是 1 的颜色深浅。

matplotlib seaborn
1个回答
0
投票

组合多个渐变以形成多色 cmap,然后重新缩放数据怎么样?

import matplotlib as mpl
from matplotlib.colors import LinearSegmentedColormap

df = pd.DataFrame({"Level 2": [1, 2, 1, 2, 3, 2, 3, 4, 0, 1, 5],
                   "Level 1": [0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]}).T

n = 5 # max value per level
level1 = pd.factorize(df.loc['Level 1'])[0]*n
n_levels = df.loc['Level 1'].nunique()

cmap = mpl.colormaps['tab10']

i = np.linspace(0, 1, num=n_levels+1)
colors = list(zip(np.sort(np.r_[i, i[1:-1]-0.001]),
                  [x for c in cmap.colors[:n_levels+1]
                   for x in (c, 'w')]))

multi_cmap = LinearSegmentedColormap.from_list('hierachical', colors)

tmp = pd.DataFrame({'Level 2': level1+df.loc['Level 2'],
                    'Level 1': level1
                    }).T

sns.heatmap(tmp, cmap=multi_cmap, vmin=0, vmax=n*n_levels)

输出:

enter image description here

如果你想用真实值进行注释:

sns.heatmap(tmp, annot=df, cmap=multi_cmap, vmin=0, vmax=n*n_levels)

输出:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.