更改 Seaborn 热图中刻度标签的旋转

Posted

技术标签:

【中文标题】更改 Seaborn 热图中刻度标签的旋转【英文标题】:Changing the rotation of tick labels in Seaborn heatmap 【发布时间】:2015-01-18 04:12:17 【问题描述】:

我正在 Seaborn 中绘制热图。问题是我的绘图中有太多正方形,因此 x 和 y 标签彼此太接近而无用。所以我正在创建一个要使用的 xticks 和 yticks 列表。但是,将此列表传递给函数会旋转图中的标签。让 seaborn 自动删除一些蜱虫真的很好,但除非我希望能够让蜱虫直立。

import pandas as pd
import numpy as np
import seaborn as sns

data = pd.DataFrame(np.random.normal(size=40*40).reshape(40,40))

yticks = data.index
keptticks = yticks[::int(len(yticks)/10)]
yticks = ['' for y in yticks]
yticks[::int(len(yticks)/10)] = keptticks

xticks = data.columns
keptticks = xticks[::int(len(xticks)/10)]
xticks = ['' for y in xticks]
xticks[::int(len(xticks)/10)] = keptticks

sns.heatmap(data,linewidth=0,yticklabels=yticks,xticklabels=xticks)

【问题讨论】:

【参考方案1】:

seaborn 在内部使用matplotlib,因此您可以使用matplotlib 函数来修改您的绘图。我修改了下面的代码以使用plt.yticks 函数来设置rotation=0,从而解决了这个问题。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns


data = pd.DataFrame(np.random.normal(size=40*40).reshape(40,40))

yticks = data.index
keptticks = yticks[::int(len(yticks)/10)]
yticks = ['' for y in yticks]
yticks[::int(len(yticks)/10)] = keptticks

xticks = data.columns
keptticks = xticks[::int(len(xticks)/10)]
xticks = ['' for y in xticks]
xticks[::int(len(xticks)/10)] = keptticks

sns.heatmap(data,linewidth=0,yticklabels=yticks,xticklabels=xticks)

# This sets the yticks "upright" with 0, as opposed to sideways with 90.
plt.yticks(rotation=0) 

plt.show()

【讨论】:

所以真的唯一需要的部分是plt.yticks(rotation=0) @Tom 是的。其余代码都在那里,以便 OP(或其他任何人)可以复制一个完整的工作图。我已经评论了它不同的具体部分以及为什么不同。 对于那些喜欢列表理解的人yticks = data.indexyticks = [str(x) if i % 10 == 0 else '' for i,x in enumerate(yticks)] 我试过这个,@Ryszard Cetnarski 建议的解决方案,这两种形式似乎都被忽略了。我已经尝试过使用 matplotlib v3.3.0 和 v3.3.3,以及 Seaborn v0.10 和 v0.11。 (所有 8 种可能性。)忽略所有旋转指令。然而,最新的 matplotlib 文档推荐了 Ffisegydd 的方法。我的气喘吁吁了。【参考方案2】:

也可以调用heatmap对象的方法:

    g = sns.heatmap(data,linewidth=0,yticklabels=yticks,xticklabels=xticks)
    g.set_yticklabels(g.get_yticklabels(), rotation = 0, fontsize = 8)

我不知道为什么这不在 sns.heatmap 的文档中,但这里描述了相同的方法:http://seaborn.pydata.org/generated/seaborn.FacetGrid.html

我相信这些方法适用于每个 seaborn 绘图对象,但找不到通用的 API。

【讨论】:

我想如果你用 matplotlib 表示法一致地调用对象会变得更加明显,即ax=sns.heatmap(..); ax.set_yticklabels()。那么在 matplotlib 文档中可能会更清楚地找到解决方案。

以上是关于更改 Seaborn 热图中刻度标签的旋转的主要内容,如果未能解决你的问题,请参考以下文章

seaborn 热图的人工刻度标签

使用 Seaborn 和 Matplotlib 在热图和线图的共享子图中对齐 x 轴刻度

在 Seaborn 热图中保留一些刻度

更改seaborn热图的轴标签[重复]

解决问题:Python使用seaborn可视化热力图heatmap旋转X轴刻度文本标签45度后发生文本平移重叠问题解决

如何修复 matplotlib 和 seaborn 热图?