【问题标题】:Seaborn Boxplot: get the xtick labelsSeaborn Boxplot:获取 xtick 标签
【发布时间】:2017-08-06 10:15:02
【问题描述】:

我正在使用 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()

这导致我在上图中。如您所见,刻度标签太长而不能排成一行。因此,我计划在 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 中的默认函数/方法更有效地做到这一点。

【问题讨论】:

    标签: python matplotlib seaborn


    【解决方案1】:

    拥有一个 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()])
    

    【讨论】:

    • 太棒了!简单的增量构建来解释所需的解决方案。
    • 别忘了import textwrap
    【解决方案2】:

    接受的答案对我不起作用(有类似消息:“FacetGrid”对象没有属性“get_xticklabels”。

    但这有效:

    g.fig.autofmt_xdate()
    

    【讨论】:

      猜你喜欢
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 2020-08-19
      • 2017-07-13
      相关资源
      最近更新 更多