来自枢轴的seaborn热图中的数据顺序

Posted

技术标签:

【中文标题】来自枢轴的seaborn热图中的数据顺序【英文标题】:Data order in seaborn heatmap from pivot 【发布时间】:2017-09-27 09:48:05 【问题描述】:

所以我有一个使用 seaborn 创建的热图

revels = rd.pivot("Flavour", "Packet number", "Contents")

ax = sns.heatmap(revels, annot=True, fmt="d", linewidths=0.4, cmap="YlOrRd")

plt.show()

产生

尽管咨询了 seaborn 的帮助文件 (http://seaborn.pydata.org/generated/seaborn.heatmap.html),但有两件事我想做,但我终生无法弄清楚如何去做。

我想做的就是以不同的方式订购口味。尽管在文本文件中输入的顺序为橙色、太妃糖、巧克力、麦芽、葡萄干、咖啡,但在绘图时不会以这种方式生成。我尝试编辑 yticklabs,但这只是编辑标签,而不是随其移动数据。

感谢您的帮助

PS 数据如下所示:

Packet number,Flavour,Contents
1,orange,4
2,orange,3
3,orange,2
...
1,toffee,4
2,toffee,3
3,toffee,3
...
etc.

【问题讨论】:

你创建了一个 df "revels",你试过按 Flavour 排序吗? 请注意,此问答网站旨在为每个问题提供一个问题。对 pandas 数据进行排序与​​更改 matplotlib 颜色条完全不同。由于第一个问题已经在这里得到了答案,所以留下那个并删除第二个。如果您不知道如何设置颜色条标签,您可以提出一个新问题。 是的,我建议将第二个问题单独分开,因为我确信@ImportanceOfBeingErnest 有答案!他的 matplotlib 技能远胜于我。 关于如何在颜色条中产生离散刻度的问题有一个good answer here。因此,我从问题中删除了该部分。 (如果您在实施链接答案时遇到问题,您可以提出一个新问题。) 【参考方案1】:

至于第一个问题,您需要对数据进行排序。您的第一行创建了一个数据框,然后您可以使用 sortlevel 方法对其进行排序。

创建数据框:

revels = rd.pivot("Flavour", "Packet number", "Contents")

由于您使用 Flavor 作为索引,所以在添加到热图之前使用 sortlevel 方法:

revels.sort_index(level=0, ascending=True, inplace=True)

这将改变热图中数据的顺序。

这显然提供了升序/降序排序,但如果您需要自定义排序顺序,请尝试以下链接: Custom sorting in pandas dataframe.

自定义排序示例

revels.index = pd.CategoricalIndex(revels.index, categories= ["orange", "toffee", "chocolate", "malteser", "raisin", "coffee"])
revels.sort_index(level=0, inplace=True)

【讨论】:

我点击了你的链接并使用了代码 revels['Flavour'] = pd.Categorical(revels['Flavour'], ["orange", "toffee", "chocolate", "malteser" , "raisin", "coffee"]) 但我得到 KeyError: 'Flavour' 有什么想法吗? 是的,您遇到了麻烦,因为 revels 将 'Flavour' 设置为索引(并删除该列)。我会更新答案。 Dataframe对象没有sortlevel属性,需要使用sort_index【参考方案2】:

上面的例子有效,但是你必须用sort_index替换sortlevel

revels.sortlevel(level=0, ascending=True, inplace=True) 变为 revels.sort_index(axis=0, ascending=True, inplace=True)

【讨论】:

以上是关于来自枢轴的seaborn热图中的数据顺序的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib 和 Numpy - 创建日历热图

如何为 seaborn 的热图或相关矩阵设置动画?

seaborn 热图的人工刻度标签

Seaborn热图顶行和底行被部分截断[重复]

根据 Seaborn 中的散点图绘制热图

控制 seaborn 热图中的单个线宽