如何使用seaborn对象旋转xticks

5

请问,有没有办法在下面的图形中旋转xticks(只是为了使其更易读)?通常的sns.xticks()在新的seaborn.objects开发中不起作用(这太棒了!)

tcap.\
    assign(date_time2 = tcap['date_time'].dt.date).\
    groupby(['date_time2', 'person']).\
    agg(counts = ('person', 'count')).\
    reset_index().\
    pipe(so.Plot, x = "date_time2", y = "counts", color = "person").\
            add(so.Line(marker="o", edgecolor="w")).\
            label(x = "Date", y = "# of messages",
                  color = str.capitalize,
                  title = "Plot 2: Volume of messages by person, by day").\
            scale(color=so.Nominal(order=["lorne_a_20014", "kayla_princess94"])).\
            show()

enter image description here

此外,我的x轴是分类变量,出现了以下警告: 使用分类单位绘制可解析为浮点数或日期的字符串列表。如果这些字符串应该被绘制为数字,请在绘制之前将其转换为适当的数据类型。我尝试使用:
import warnings
warnings.filterwarnings("ignore",category=UserWarning)

对于不使用 seaborn.objects 的相同问题,请参见 在 seaborn 中旋转标签文本 - Trenton McKinney
2个回答

5

这可以通过创建一个Axis对象,旋转轴并使用so.Plot().on()方法应用旋转后的轴标签来完成。请注意,如果您还计划添加facets,则此方法将无法起作用(我在查找如何将其与facets相结合时发现了您的问题)。

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

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

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

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

Line graph with rotated x-axis labels


1
涉及使用matplotlib axes进行绘图的答案可能是正确的方法,但这样做会改变seaborn使用的布局引擎。幸运的是,您实际上可以获取seaborn绘图的底层Figure并直接进行操作,但这依赖于与seaborn的内部交互,因此可能会在将来的版本中出现问题。
您可以获取底层图形的轴并像这样更改刻度标签的旋转:
# This gives you the Plotter object used for rendering the plot
p = so.Plot(...).add(so.Line()).plot()
# Then you can get the internal Figure object with `._figure`:
p._figure.axes[0].xaxis.set_tick_params(rotation=90)

你可以使用 p.show() 或者 display(p) 或者 p.save(...) 来正常渲染。

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