【问题标题】:Heatmap with category values in seabornseaborn中具有类别值的热图
【发布时间】:2021-12-30 21:09:39
【问题描述】:

我有以下数据框。

ID   Cat  V1 V2 V3
1     A    1  1  1
2     B    1  1  1
3     A    1  1  0
4     C    0  0  0

我想创建一个图(类似于热图),显示是否观察到 V1 到 V3 (1) (0)。 此外,每个字段都应根据行的类别着色。 例如Cat为A,则为红色;如果Cat为B,则为绿色;如果Cat 是C,它应该是蓝色的。
因此,在这种情况下,热图第一行中的所有方块都应为红色,第二行中的所有方块都应为绿色。

我想在 python 中使用 seaborn 或 matplotlib 来创建绘图。 但是,我不知道情节的类型。

【问题讨论】:

    标签: matplotlib seaborn


    【解决方案1】:

    可能存在较少涉及的方式。以下方法循环遍历类别;对于每个类别,热图都用相应的颜色填充。

    
    import matplotlib.pyplot as plt
    from matplotlib.colors import ListedColormap
    import seaborn as sns
    import pandas as pd
    import numpy as np
    from io import StringIO
    
    data_str = '''ID   Cat  V1 V2 V3
    1     A    1  1  1
    2     B    1  1  1
    3     A    1  1  0
    4     C    0  0  0'''
    df = pd.read_csv(StringIO(data_str), delim_whitespace=True)
    df = df.set_index('ID')
    fig, ax = plt.subplots(figsize=(6, 6))
    categories = ['A', 'B', 'C']
    colors = ['crimson', 'lime', 'dodgerblue']
    for cat, color in zip(categories, colors):
        df_cat = df[['V1', 'V2', 'V3']][df['Cat'] == cat].reindex(df.index, fill_value=0)
        df_cat[['V1', 'V2', 'V3']] = df_cat[['V1', 'V2', 'V3']].replace({0: np.nan})
        if not np.all(df_cat.isna()):
            sns.heatmap(data=df_cat, cmap=ListedColormap([color]), cbar=False, lw=1, alpha=1, ax=ax)
    plt.show()
    

    【讨论】:

    • 这是回答你的问题还是你需要别的东西?
    猜你喜欢
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 2020-01-13
    • 2020-10-12
    相关资源
    最近更新 更多