在 seaborn 中旋转标签文本

274

我有一个简单的因子图

import seaborn as sns
g = sns.factorplot("name", "miss_ratio", "policy", dodge=.2, 
    linestyles=["none", "none", "none", "none"], data=df[df["level"] == 2])

enter image description here

问题是X标签全都挤在一起,无法阅读。您如何旋转文本以使标签可读?

53
import matplotlib.pylab as plt . plt.xticks(rotation=‌​45) - rafaelvalle
Dexplot库具有在不使用matplotlib的情况下包装标签、设置图形大小和dpi的能力。 - Ted Petrou
这对我很有帮助:https://dev59.com/HMXsa4cB1Zd3GeqPlpPx - Jimmy Carter
有关 seaborn.objectsv0.12 版本,请参见如何使用 seaborn.objects 旋转 xticks - Trenton McKinney
10个回答

426

我对@mwaskorn的回答有些问题,具体来说是

g.set_xticklabels(rotation=30)

失败了,因为这也需要标签。比@Aman的答案容易一点的方法就是只需添加

plt.xticks(rotation=45)

51
您可以使用以下代码来获取标签 g.set_xticklabels(g.get_xticklabels(), rotation=30),如果您想要抑制输出,请将其赋值给一个变量。 - joelostblom
3
我认为这是正确的,当我设置 plt.xtics 时它对我有效。 - muammar
1
当我尝试这样做时,我的xticklabels不再与x ticks对齐。有人知道为什么吗? - Rylan Schaeffer
3
我建议还要添加 plt.tight_layout(),这样边距就会自动调整以适应文本。 - Ufos
3
现在g.set_xticklabels(rotation=30)可以在FacetGrid上使用了。 - Ufos
显示剩余2条评论

271

您可以使用Matplotlib Axes对象上的tick_params方法旋转刻度标签。以下是一个具体的示例:

ax.tick_params(axis='x', rotation=90)

好的,我想到了以下代码:for ax in g.axes.flatten(): \n for t in ax.get_xticklabels(): \n t.set(rotation=30) (注意:此处为Python代码,翻译仅供参考) - soupault
10
@ soupault - 这对我很有用,与你想出的方式类似,但可能更加简洁明了 - 对于g中的每个轴ax,执行以下操作: 将横坐标标签文本旋转30度:ax.set_xticklabels(ax.get_xticklabels(), rotation=30) - odedbd
10
使用ha="right"将x轴标签居中对齐到它们的刻度线上。例如:g.set_xticklabels([label1, label2], rotation=30, ha='right') - Manavalan Gajapathy
102
与上面几条评论类似,我在执行代码时遇到错误,直到我将g.set_xticklabels(rotation=30)更改为g.set_xticklabels(g.get_xticklabels(), rotation=30),才没有报错。感谢这个答案:https://dev59.com/npvga4cB1Zd3GeqPwBHB#39689464 - Max Power
1
一些Seaborn绘图方法返回一个FacetGrid对象,有些则返回Matplotlib的Axes对象。对于前者,不设置标签也可以工作,而对于后者,则不行。您可以通过查看文档来确定哪些是FacetGrid对象:https://seaborn.pydata.org/api.html。例如,如果您使用`g = sns.catplot(),那么它将起作用,但是sns.barplot()不会,因为它返回的是一个Axes`对象。 - getup8
显示剩余5条评论

37

这仍然是一个 matplotlib 对象。尝试一下:

# <your code here>
locs, labels = plt.xticks()
plt.setp(labels, rotation=45)

22

任何由FacetGrid支持的Seaborn图表(例如catplot)都无法正常工作。

g.set_xticklabels(rotation=30) 

然而,由于facetgrid不支持barplot、countplot等,因此它们将正常工作。以下内容适用于它们。

g.set_xticklabels(g.get_xticklabels(), rotation=30)

此外,如果您有两个相互叠加的图形,请尝试在支持它的图形上使用set_xticklabels。


13

如果有人想知道如何为clustermap CorrGrids(seaborn示例的一部分)做此操作:

import seaborn as sns
import matplotlib.pyplot as plt
sns.set(context="paper", font="monospace")

# Load the datset of correlations between cortical brain networks
df = sns.load_dataset("brain_networks", header=[0, 1, 2], index_col=0)
corrmat = df.corr()

# Set up the matplotlib figure
f, ax = plt.subplots(figsize=(12, 9))

# Draw the heatmap using seaborn
g=sns.clustermap(corrmat, vmax=.8, square=True)
rotation = 90 
for i, ax in enumerate(g.fig.axes):   ## getting all axes of the fig object
     ax.set_xticklabels(ax.get_xticklabels(), rotation = rotation)


g.fig.show()

12

你也可以使用plt.setp,方法如下:

import matplotlib.pyplot as plt
import seaborn as sns

plot=sns.barplot(data=df,  x=" ", y=" ")
plt.setp(plot.get_xticklabels(), rotation=90)

将标签旋转90度。


8

对于一个 seaborn.heatmap,你可以使用以下方式来旋转它们(基于@Aman的答案

pandas_frame = pd.DataFrame(data, index=names, columns=names)
heatmap = seaborn.heatmap(pandas_frame)
loc, labels = plt.xticks()
heatmap.set_xticklabels(labels, rotation=45)
heatmap.set_yticklabels(labels[::-1], rotation=45) # reversed order for y

1
这对我起作用了,仅传递旋转参数没有任何作用,我还必须传递标签才能使其工作。 - Raveen Beemsingh

4

使用matplotlib.pyplot.xticks可以实现此操作。

import matplotlib.pyplot as plt

plt.xticks(rotation = 'vertical')

# Or use degrees explicitly 

degrees = 70  # Adjust according to one's preferences/needs
plt.xticks(rotation=degrees)

这里有一个例子,可以看到它是如何工作的。


2

如果标签名称很长,可能很难正确地获取它。我使用 catplot 的一个解决方案是:

import matplotlib.pyplot as plt
fig = plt.gcf()
fig.autofmt_xdate()

1
使用ax.tick_params(labelrotation=45)。您可以将其应用于绘图中的轴图,而无需提供标签。如果您不想采用FacetGrid,这是一种替代方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接