首页 > 解决方案 > 同一轴上的多个 plot_dates 具有不均匀的刻度和网格

问题描述

我有一些代表在前端应用程序中进行的用户活动的数据框。我试图将这些活动绘制在每个用户的单个图上,其中每种活动都在单独的一行上。目标是对用户活动有一个很好的纵向视图。我正在为每个用户创建一个子图,然后调用plot_date每种类型的活动。我看到的问题是 x 轴上有额外/错位的刻度线和网格线。当我增加调用时,这个问题变得更糟plot_date(我的真实代码中有 5 个不同的调用)。我试过有和没有sharex。我试过了autofmt_xdate。我什至尝试过明确设置xlim在各个地方。没有什么可以摆脱额外的刻度线/网格线。我确信我可以通过手动覆盖代码末尾的刻度来解决这个问题,但这感觉不对。有没有更好的方法来处理这个问题?这让我感觉很崩溃。

ncols = 2
len_list = 4
nrows  = int(np.ceil(len_list / ncols))
fig, ax = plt.subplots(figsize=(16,2*nrows), nrows=nrows, ncols=ncols, sharex=True, sharey=True)
for i, user in enumerate(sorted(expected_users)[:4]):
    row = int(i/ncols)
    col = i%ncols
    user_paginations = expected_paginations[expected_paginations['action_by'] == user]
    user_actions = expected_actions[expected_actions['action_by'] == user]
    if not user_actions.empty:
        print('actions', user_actions['date'].min(), user_actions['date'].max())
        ax[row,col].plot_date(user_actions['date'], np.random.uniform(0, 0.5, user_actions.shape[0]) + 0, alpha=0.5, label='action')
    if not user_paginations.empty:
        print('pages', user_paginations['date'].min(), user_paginations['date'].max())
        ax[row,col].plot_date(user_paginations['date'], np.random.uniform(0, 0.5, user_paginations.shape[0]) + 1, alpha=0.5, label='paginate')
plt.tight_layout()
fig.autofmt_xdate()

破碎的滴答声

作为参考,我在产生以下输出的代码中添加了一些打印语句:

actions 2019-12-20 07:24:39.362000 2020-01-16 11:14:11.776000
pages 2019-12-20 07:33:58.294000 2020-01-16 07:13:17.629000
actions 2020-01-03 11:20:05.271000 2020-01-16 09:25:21.311000
pages 2020-01-14 13:27:02.093000 2020-01-16 09:18:14.726000
actions 2020-01-08 06:55:40.045000 2020-01-08 06:55:40.775000
actions 2020-01-07 10:04:37.674000 2020-01-08 13:53:58.130000
pages 2020-01-07 09:59:29.376000 2020-01-08 13:34:48.712000

编辑:我在这里要强调的问题是刻度线的间距不均匀。随着我添加更多数据点,这一点变得更加明显。我附上了一些额外的例子来进一步强调这个问题。

所有 6 种活动类型: 在此处输入图像描述

并且用更少的例子来表明它不是导致问题的用户(子图)的数量: 在此处输入图像描述

我还只用一个地块重新运行它,以验证它不是由多个地块引起的。

仔细观察,问题总是发生在每月的第一天。除第一个日期外,所有日期的距离完全相同。

我在https://gist.github.com/mdbecker/727a362ff573a459c5d7a66dfc46836e上发布了一个“最小”数据集和示例代码,您可以使用它来重现此问题。

更新 2:将 matplotlib 更新到 3.1.1(从 3.0.2)修复了这个错误。

标签: pythonpandasmatplotlibjupyter-notebook

解决方案


推荐阅读