我们如何在热图中绘制来自多索引数据框的数据?

Posted

技术标签:

【中文标题】我们如何在热图中绘制来自多索引数据框的数据?【英文标题】:How can we plot data from a multi-index dataframe in a heatmap? 【发布时间】:2021-10-11 18:40:09 【问题描述】:

我正在像这样旋转一个数据框。

pvt = pd.pivot_table(df_build, values='Expense', index=['Name'], columns=['Comments', 'Venue'], aggfunc=np.sum)
pvt = pvt.fillna(0)
pvt.columns

现在,我有一个包含这些列的数据框。

MultiIndex([(       'Build',        'Arena'),
            (       'Build',      'Stadium'),
            (       'Add',          'Arena'),
            (       'New',        'Stadium'),
            (       'Replace',      'Arena')],
           names=['Comments', 'Venue'])

我正在尝试将此数据绘制为热图。我更喜欢使用 Plotly,但 Seaborn 也很好。我以为下面的代码会起作用,但它没有。

df_fin = pvt.reset_index().pivot(columns='Comments', index='Venue', values='Expense')
ax = sns.heatmap(df_fin)
ax.plot()

也许需要发生某种融化。不确定。如何将此数据绘制为热图?

【问题讨论】:

【参考方案1】: 已经模拟了我认为是您的旋转数据框的结构 核心是重塑这个数据框,使其与https://plotly.com/python/heatmaps/#heatmap-with-plotlyexpress-and-pximshow兼容 stack()热图y轴 确保索引只有一级 (droplevel()) 生成图形
import pandas as pd
import numpy as np
import plotly.express as px

# build df that matches pivoted df
df = pd.DataFrame(
    index=pd.MultiIndex.from_arrays(
        [
            ["Build", "Build", "Add", "New", "Replace"],
            ["Arena", "Stadium", "Arena", "Stadium", "Arena"],
        ],
        names=["Comments", "Venue"],
    ),
    data = np.random.randint(1,5,5)
).T

# now restructure it for plotly
dfp = df.stack("Venue").droplevel(0,0)

# finally a simple plotly figure...
px.imshow(dfp.values, x=dfp.columns, y=dfp.index)


【讨论】:

完美运行!感谢您的帮助!

以上是关于我们如何在热图中绘制来自多索引数据框的数据?的主要内容,如果未能解决你的问题,请参考以下文章

来自另一个数据框的熊猫多索引分配

如何将多索引列转换为熊猫数据框的单索引列?

来自多索引数据的堆叠图

带有多索引熊猫数据框的条形图

如何使用单个索引更新多索引数据框中的记录

在 Pandas 数据框的多索引数据中按索引和值排序