Seaborn箱线图:获取xtick标签

13

我正在使用Seaborn从Pandas数据框中制作箱线图。

colorpalette = sns.hls_palette(8,h=.9)
g = sns.boxplot(x="estimator", y="mean_score", data=dFrame, palette=colorpalette)

g.set(ylabel='Mean Accuracy', xlabel='')
plt.show()

enter image description here

这是我之前的一个结果。如您所见,刻度标签太长不能在一行中呈现。因此,我打算在xticklabels上使用textwrap将它们跨越多行展示。为了获取这些标签,我尝试使用:

g.xaxis.get_ticklabels()

返回以下内容

<a list of 9 Text major ticklabel objects>

如果我像这样在循环中尝试它

for item in g.xaxis.get_ticklabels():
    print(item)

我获得了以下输出

Text(0,0,'ExtraTreesClassifier')
Text(1,0,'RandomForestClassifier')
Text(2,0,'GradientBoostingClassifier')
Text(3,0,'LogisticRegression')
Text(4,0,'DecisionTreeClassifier')
Text(5,0,'kNearestNeighbors')
Text(6,0,'LinearSVC')
Text(7,0,'Perceptron')

是否有一种使用Seaborn默认函数/方法更有效率的方法呢?

3个回答

26

如果您拥有一个 matplotlib 的坐标轴实例 ax (例如 seaborn 绘图返回的实例),

ax = sns.boxplot(...)

允许获取刻度标签作为

ax.get_xticklabels()

最简单的从列表中获取文本的方法是:
texts = [t.get_text()  for t in ax.get_xticklabels()]

即时换行文本也可以完成

texts = [textwrap.fill(t.get_text(), 10)  for t in ax.get_xticklabels()]

甚至将文本设置为刻度标签也可以在同一行完成

ax.set_xticklabels([textwrap.fill(t.get_text(), 10)  for t in ax.get_xticklabels()])

太好了!通过简单的、逐步的方法来解释所需的解决方案。 - chinnychinchin
4
不要忘记import textwrap - Archie

2

对我来说,被接受的答案并没有起作用(出现了类似于“FacetGrid”对象没有“get_xticklabels”的属性的消息)。

但是这个方法可以解决问题:

g.fig.autofmt_xdate()

0

不要扭曲文本,可以旋转标签,并在底部添加边距

plt.xticks(rotation=60, ha='right')
plt.subplots_adjust(bottom=0.3)

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