python - 同一轴上的多个 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
编辑:我在这里要强调的问题是刻度线的间距不均匀。随着我添加更多数据点,这一点变得更加明显。我附上了一些额外的例子来进一步强调这个问题。
我还只用一个地块重新运行它,以验证它不是由多个地块引起的。
仔细观察,问题总是发生在每月的第一天。除第一个日期外,所有日期的距离完全相同。
我在https://gist.github.com/mdbecker/727a362ff573a459c5d7a66dfc46836e上发布了一个“最小”数据集和示例代码,您可以使用它来重现此问题。
更新 2:将 matplotlib 更新到 3.1.1(从 3.0.2)修复了这个错误。
解决方案
推荐阅读
- javascript - 如何在将数据导出到 Excel 工作表之前将 JS 脚本中的 Excel 列类型更改为文本?
- google-drive-api - 谷歌驱动器 API 验证的域不适用于更改手表
- electron - 如何从渲染器文件处理 electronjs 中的全局快捷方式和文件菜单项单击事件?
- reactjs - 部署在服务器上时路由不起作用
- c++ - 从 C++ 函数返回局部变量?
- arrays - 使用 3 阵列检查能力
- android - react-native fb phone auth android signInWithPhoneNumber error [auth/app-not-authorized] ... [通过了一个安全网令牌
- c++ - 每当我输入不同的数据类型时,我都会进入无限循环
- python - 使用 asyncio 并行化工作的正确方法
- sql-server - SQL Server 在导入期间将美国日期格式转换为英国?