如何旋转多面seaborn.objects图中的轴标签?

问题描述 投票:0回答:1

我正在使用最新版本的

seaborn
中出色的 seaborn.objects 模块。

我想制作一个情节:

  • 带有旋转的 x 轴标签
  • 有面

seaborn.objects
不直接支持旋转 x 轴标签(制作图表后像
plt.xticks()
这样的标准东西不起作用),但文档建议使用
.on()
方法来实现。
.on()
采用 matplotlib 图形/子图或轴对象并在其之上构建。正如我在回答这个问题时指出的,以下代码可用于旋转轴标签:

import seaborn.objects as so
import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame({'a':[1,2,3,4],
                   'b':[5,6,7,8],
                   'c':['a','a','b','b']})

fig, ax = plt.subplots()
ax.xaxis.set_tick_params(rotation=90)

(so.Plot(df, x = 'a', y = 'b')
 .add(so.Line())
 .on(ax))

但是,如果我通过将图形代码更改为

来添加构面
(so.Plot(df, x = 'a', y = 'b')
 .add(so.Line())
 .on(ax)
 .facet('c'))

我收到错误

Cannot create multiple subplots after calling Plot.on with a <class 'matplotlib.axes._axes.Axes'> object. You may want to use a <class 'matplotlib.figure.SubFigure'> instead.

但是,如果我按照说明操作,而是使用

fig
对象,旋转其中的轴,我会得到一个奇怪的双 x 轴,其旋转标签与数据无关,而实际图形的标签未旋转:

fig, ax = plt.subplots()
plt.xticks(rotation = 90)

(so.Plot(df, x = 'a', y = 'b')
 .add(so.Line())
 .on(fig)
 .facet('c'))

Faceted graph with strange dual labeling

如何将旋转轴标签与面合并?

python matplotlib seaborn seaborn-objects
1个回答
1
投票

您最终会得到多个轴绘制在彼此之上。注意

Plot.on
的参数说明:

通过

matplotlib.axes.Axes
将添加艺术家,而无需修改图形。否则,将在给定
matplotlib.figure.Figure
matplotlib.figure.SubFigure
的空间内创建子图。

此外,

pyplot
函数(即
plt.xticks
)仅作用于“当前”轴,而不是当前图形中的所有轴。

所以,两步解决方案:

  • 仅在外部初始化图形,并将子图创建委托给
    Plot
  • 使用matplotlib的面向对象接口修改刻度标签参数

示例:

fig = plt.figure()

(so.Plot(df, x = 'a', y = 'b')
 .add(so.Line())
 .on(fig)
 .facet('c')
 .plot()
)

for ax in fig.axes:
    ax.tick_params("x", rotation=90)

enter image description here

请注意,可能可以直接通过

Plot
API 控制刻度标签旋转,尽管旋转刻度标签(尤其是 90 度)通常不是使重叠标签可读的最佳方式。

© www.soinside.com 2019 - 2024. All rights reserved.