首页 > 解决方案 > Matplotlib x 轴刻度,日期的固定位置

问题描述

在我正在制作的时间线图中,我希望日期代码只显示指定的日期。(在我的示例中,我显示事件“A”的代码,但它可以是代码上的任何列表)。我发现了当 x 轴数据为数字时(在我的示例中为上子图)如何执行此操作,但这不适用于时间戳日期类型(下图)。

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.dates as mdates
    import matplotlib.ticker as ticker

    myData = pd.DataFrame({'date':['2019-01-15','2019-02-10','2019-03-20','2019-04-17','2019-05-23','2019-06-11'],'cnt':range(6),'event':['a','b','a','b','a','b']})
    myData['date'] = [pd.Timestamp(j) for j in myData['date']]

start = pd.Timestamp('2019-01-01')
stop = pd.Timestamp('2019-07-01')
inxa = myData.loc[myData['event'] == 'a'].index
inxb = myData.loc[myData['event'] == 'b'].index
# create two plots, one with 'cnt' as x-axis, the other 'dates' on x-axis.
fig, ax = plt.subplots(2,1,figsize=(16,9))
ax[0].plot((0,6),(0,0), 'k')
ax[1].plot((start, stop),(0,0))


for g in inxa:
    ax[0].plot((myData.loc[g,'cnt'],myData.loc[g,'cnt']),(0,1),c='r')
    ax[1].plot((myData.loc[g,'date'],myData.loc[g,'date']),(0,1),c='r')
for g in inxb:
    ax[0].plot((myData.loc[g,'cnt'],myData.loc[g,'cnt']),(0,2),c='b')
    ax[1].plot((myData.loc[g,'date'],myData.loc[g,'date']),(0,2),c='b')
xlist0 = myData.loc[myData['event']=='a','cnt']
xlist1 = myData.loc[myData['event']=='a','date']

ax[0].xaxis.set_major_locator(ticker.FixedLocator(xlist0))
# ax[1].xaxis.set_major_locator(**???**)

在此处输入图像描述

标签: pythonmatplotlib

解决方案


找不到足够的副本,也许我看起来不够努力。有多种方法可以做到这一点:

首先转换为数字或使用 Pandas DateTime Series 的基础

xticks = [mdates.date2num(z) for z in xlist1]
# or
xticks = xlist1.values

以及至少几种使用它/它们的方法

ax[1].xaxis.set_major_locator(ticker.FixedLocator(xticks))
ax[1].xaxis.set_ticks(xticks)

日期刻度标签
如何在 matplotlib 中为日期设置 xticklabels
如何每小时获取刻度?
...


推荐阅读