【问题标题】:Controlling tick labels alignment in pandas Boxplot within subplots在子图中控制熊猫箱线图中的刻度标签对齐
【发布时间】:2016-02-08 04:45:41
【问题描述】:

对于单个箱线图,刻度标签对齐可以这样控制:

import matplotlib.pyplot as plt
import matplotlib as mpl
%matplotlib inline

fig,ax = plt.subplots()
df.boxplot(column='col1',by='col2',rot=45,ax=ax)
plt.xticks(ha='right')

这是必要的,因为当刻度标签很长时,如果刻度标签居中(默认行为),则无法读取绘图。

现在讨论多个子图的情况。 (很抱歉,我没有发布完整的代码示例)。我先搭建主图:

fig,axarr = plt.subplots(ny,nx,sharex=True,sharey=True,figsize=(12,6),squeeze=False)

然后是一个 for 循环,它遍历所有子图轴并调用一个函数,该函数在每个轴对象中绘制一个箱线图:

    for key,gr in grouped:
        ix = i/ny # Python 2
        iy = i%ny
        add_box_plot(gr,xcol,axarr[iy,ix])

在哪里

def add_box_plot(gs,xcol,ax):
    gs.boxplot(column=xcol,by=keyCol,rot=45,ax=ax)

我还没有找到正确对齐刻度标签的方法。

如果我添加 plt.xticks(ha='right') 在函数中的 boxplot 命令之后,只有 last 子图才能正确对齐刻度(为什么?)。

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:

    如果我在函数中的 boxplot 命令之后添加 plt.xticks(ha='right'),则只有最后一个子图才能正确对齐刻度(为什么?)。

    这是因为plt.xticks 指的是最后一个活动轴。当您创建子图时,最后创建的子图处于活动状态。然后,您可以直接访问坐标轴对象(尽管它们在您的代码中被称为 gsgr,无论这意味着什么)。但是,这不会更改活动轴。

    解决方案 1:

    使用plt.sca()设置当前坐标轴:

    def add_box_plot(gs, xcol, ax):
        gs.boxplot(column=xcol, by=keyCol, rot=45, ax=ax)
        plt.sca(ax)
        plt.xticks(ha='right')
    

    解决方案 2:

    改用Axes.set_xticklabels()

    def add_box_plot(gs, xcol, ax):
        gs.boxplot(column=xcol,by=keyCol,rot=45,ax=ax)
        plt.draw()  # This may be required to update the labels
        labels = [l.get_text() for l in ax.get_xticklabels()]
        ax.set_xticklabels(labels, ha='right')
    

    我不确定是否总是需要调用plt.draw(),但如果我不使用它,我只会得到空标签。

    【讨论】:

    • katzemakase,感谢您的帮助。除了您将 gs 与 ax 混​​淆之外,您的解决方案 1 确实有效。您的解决方案 2 不起作用:我得到标签的文字描述而不是实际标签。也就是说,标签看起来像u\\\'Text(5,0,u...
    • @germ 你是对的。我已经更新了从解决方案 2 中的 Text 对象中提取标签的答案。此外,我确实混淆了 gs 和 ax。什么是gs?
    • 是的,您的解决方案 2 现在可以正常工作。 plt.draw() 不是必需的。 gs 是一个 pandas groupby 对象,其中包含要绘制的数据。
    【解决方案2】:

    由于您使用的是mpl 面向对象的界面,您可以单独设置每个轴的刻度参数。

    在 add_box_plot 函数中添加一行来设置xticklabels(在gs.boxplot 之后)。与plt.xticks 不同,你不能只给set_xticklabels 提供ha 关键字,它还需要你给它一个刻度标签列表。在这里,我们可以使用get_xticklabels 抓取现有的标签:

    def add_box_plot(gs,xcol,ax):
        gs.boxplot(column=xcol,by=keyCol,rot=45,ax=ax)
        ax.set_xticklabels(ax.get_xticklabels(),ha='right')
    

    这是一个显示此工作的最小示例:

    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np
    
    # We'll create two subplots, to test out different alignments
    fig,(ax1,ax2) = plt.subplots(2)
    
    # A sample dataframe
    df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
    
    # Boxplot on first subplot
    df.boxplot(ax=ax1)
    
    # Boxplot on second subplot
    df.boxplot(ax=ax2)
    
    # Set xticklabels to right alignment
    ax1.set_xticklabels(ax1.get_xticklabels(),ha='right')
    
    # Set xticklabels to left alignment
    ax2.set_xticklabels(ax2.get_xticklabels(),ha='left')
    
    plt.show()
    

    请注意,xticklabels 在顶部子图上右对齐,在底部左对齐。

    【讨论】:

    • Tom,请参阅上面有关您的解决方案的评论,这与 kazemakase 的解决方案 2 相同。它无法正常工作。你知道如何解决这个问题吗?
    • 这对我来说适用于从熊猫数据框创建的箱线图。请参阅我的编辑中的示例。
    猜你喜欢
    • 2013-05-21
    • 2018-11-13
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    相关资源
    最近更新 更多