【问题标题】:matplotlib subplots with variable width/data limits具有可变宽度/数据限制的 matplotlib 子图
【发布时间】:2014-03-11 22:56:49
【问题描述】:

我正在使用 pandas 和 matplotlib 绘制涉及 5 个会话的实验的数据。我希望每个会话的数据显示在单独的面板中;我正在尝试使用子图来执行此操作。

使用下面的代码,我几乎得到了我想要的东西(参见此处的示例图:http://imgur.com/99nK2TR)。问题是不同的会话有不同的试验次数,并且当我绘制时,不同面板的比例会发生变化。我希望所有图中的比例都相同,而要调整子图边界框的大小。具体来说,试验应在所有面板上等距分布,因此面板 S1 和 S2b(每个包含 12 个试验)将比面板 S2a、S3a 和 S3b(每个包含 3 个试验)宽。

我想我可能必须使用方面和/或可调整和/或 sharex 的某种组合,但我无法理解如何...

为我是新来的伪劣编码道歉=)

fig,([ax1,ax2,ax3,ax4,ax5]) = plt.subplots(1, 5, sharey=True)

dfsubset1.plot(xticks=range(1,13,1), xlim=[0,13], ylim=[0,35], ax=ax1, title='S1', figsize=(12, 6), style='o-', legend=False)
dfsubset2.plot(xticks=range(1,4,1), xlim=[0,4], ylim=[0,35], ax=ax2, title='S2a', figsize=(12, 6), style='o-', legend=False)
dfsubset3.plot(xticks=range(1,13,1), xlim=[0,13], ylim=[0,35], ax=ax3, title='S2b', figsize=(12, 6), style='o-', legend=False)
dfsubset4.plot(xticks=range(1,4,1), xlim=[0,4], ylim=[0,35], ax=ax4, title='S3a', figsize=(12, 6), style='o-', legend=False)
dfsubset5.plot(xticks=range(1,4,1), xlim=[0,4], ylim=[0,35], ax=ax5, title='S3b', figsize=(12, 6), style='o-', legend=False)

【问题讨论】:

    标签: python matplotlib plot pandas


    【解决方案1】:

    有几种方法可以做到这一点。假设您必须将数据读入单独的数据帧:

    all_df = [df1, df2, ..., dfN]
    fig, axes = plt.subplots(ncols=len(all_df), sharey=True)
    for df, ax in zip(all_df, axes):
        df.plot(ax=ax)
    

    您可以将您的 x 限制和标题放入(列表的)列表中,并将它们压缩到一个循环中,但我强烈建议您从循环内的数据帧中计算它们。如果sharey=True,则设置 y 限制没有意义。

    如果您实际上能够将所有数据放在同一个数据框的各个列中,那么它可能就像bigdf.plot(x='xcol', sharey=True, subplots=True) 一样简单

    【讨论】:

    • 嗨,保罗,感谢您的帮助。事后看来,我应该更清楚我正在使用的数据框 - 我试图简化上面的示例,但它有点复杂,所以我正在努力实施你的建议。
    • df 有一个分层索引,请参见此处:imgur.com/ue2ZrbL 当我尝试按照您的步骤操作时,我只是得到了一系列长度相同的垂直子图。这些图需要是水平的 - 显示实验的时间进程 - 并具有适当的宽度(即 S1 中的 12 次试验,S2a 中的 3 次等)。希望这更清楚......
    • 这是我不久前在 ggplot2 中制作的类似内容:imgur.com/qMx1Bw9 NB 在这种情况下,会话 3a 和 3b 已折叠。
    • @user3408208 您确实需要发布一些数据和一个最小的工作示例。我仍然不明白它是否都在一个大数据框中。这是一个示例,说明如何将您的数据包含在一个最小的工作示例中,以防您不确定:stackoverflow.com/questions/22159805/…
    猜你喜欢
    • 2018-08-24
    • 2022-01-05
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 2019-07-29
    • 2020-04-23
    • 2021-05-16
    相关资源
    最近更新 更多