来自枢轴的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热图中的数据顺序的主要内容,如果未能解决你的问题,请参考以下文章