Python 3.x Matplotlib-带日期的水平条形图时间线-Xticks不显示日期

Python 3.x Matplotlib-带日期的水平条形图时间线-Xticks不显示日期,python-3.x,numpy,datetime,matplotlib,bar-chart,Python 3.x,Numpy,Datetime,Matplotlib,Bar Chart,尝试制作一个看起来像第一个图像的图形 然而,当我尝试实现它时,我不知道如何在X轴上打印日期,比例似乎是正确的,只是XTick似乎不是日期,而是一些基本上随机的数字。典型输出如图2所示 我怎样才能在xticks上显示日期。我希望它显示2019-12-01和2021-03-01(3月1日)之间的每个月或季度 任何使其看起来更像第一张图片的格式都有额外的积分 import matplotlib.pyplot as plt import numpy as np from datetime import

尝试制作一个看起来像第一个图像的图形

然而,当我尝试实现它时,我不知道如何在X轴上打印日期,比例似乎是正确的,只是XTick似乎不是日期,而是一些基本上随机的数字。典型输出如图2所示

我怎样才能在xticks上显示日期。我希望它显示2019-12-01和2021-03-01(3月1日)之间的每个月或季度

任何使其看起来更像第一张图片的格式都有额外的积分

import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime
event = np.array(['Groupone','Grouptwo','Group3','Group4','Group5','Group6'])
begin = np.array([datetime(year=2019,month=12,day=1),datetime(year=2020,month=2,day=1),datetime(year=2020,month=5,day=1),datetime(year=2020,month=11,day=1),datetime(year=2019,month=12,day=1),datetime(year=2020,month=5,day=1)])
end = np.array([datetime(year=2019,month=12,day=30),datetime(year=2021,month=2,day=1),datetime(year=2021,month=2,day=1),datetime(year=2021,month=2,day=1),datetime(year=2021,month=2,day=1),datetime(year=2020,month=7,day=3)])

beg_sort = np.sort(begin)
end_sort = end[np.argsort(begin)]
evt_sort = event[np.argsort(begin)]

plt.barh(range(len(beg_sort)), end_sort-beg_sort, left=beg_sort, align='center')
plt.yticks(range(len(beg_sort)), evt_sort)

plt.yticks(range(len(beg_sort)), evt_sort)

plt.show()(begin)
end_sort = end[np.argsort(begin)]
evt_sort = event[np.argsort(begin)]

plt.barh(range(len(beg_sort)), end_sort-beg_sort, left=beg_sort, align='center')

plt.yticks(range(len(beg_sort)), evt_sort)

plt.show()


您可以将每个条形图绘制为线条,选择您喜欢的线条宽度(
lw
):

#设置网格线的颜色
mpl.rcParams['grid.color']=“w”
图,ax=plt子批次(1,1)
#将eac项目打印为一行
对于枚举(zip(beg_排序、end_排序、evt_排序)中的i(b、e、l):
ax.绘图日期([b,e],[i+1]*2,ls='-',marker=None,lw=10)#线宽为10
#在y轴上设置记号和标签
ax.set_yticks(范围(1,len(evt_排序)+1))
ax.设置标签(evt排序)
#设置网格的颜色和透明度
ax.patch.set_facecolor('灰色')
最大补丁集_alpha(0.3)
#激活网格
ax.grid(真)


此外,您还可以使用背景网格,根据您的需要进行定制。

将一些有用的东西拼凑在一起,出于好奇而发布,不过请使用上面PieCot的答案:

import matplotlib.pyplot as plt
import numpy as np
from datetime import date
from datetime import datetime
import matplotlib.dates as mdates
#https://stackoverflow.com/questions/58387731/plotting-month-year-as-x-ticks-in-matplotlib
fig, ax = plt.subplots(ncols=2, nrows=1, figsize=(15, 4.18))

#fig, ax = plt.figure( figsize=(15, 4.18))

event = np.array(['Groupone','Grouptwo','Group3','Group4','Group5','Group6'])
begin = np.array([datetime(year=2019,month=12,day=1),datetime(year=2020,month=2,day=1),datetime(year=2020,month=5,day=1),datetime(year=2020,month=11,day=1),datetime(year=2019,month=12,day=1),datetime(year=2020,month=5,day=1)])
end = np.array([datetime(year=2019,month=12,day=30),datetime(year=2021,month=2,day=1),datetime(year=2021,month=2,day=1),datetime(year=2021,month=2,day=1),datetime(year=2021,month=2,day=1),datetime(year=2020,month=7,day=3)])

beg_sort = np.sort(begin)
end_sort = end[np.argsort(begin)]
evt_sort = event[np.argsort(begin)]
#start_m     = click.prompt('Start month', type=int)
#start_y     = click.prompt('Start year', type=int)
#end_m       = click.prompt('End month', type=int)
#end_y       = click.prompt('End year', type=int)
start_m     = 12
start_y     = 2019
end_m       = 3
end_y       = 2021
months = mdates.MonthLocator()          # Add tick every month
#days = mdates.DayLocator(range(1,32,5)) # Add tick every 5th day in a month
#monthFmt = mdates.DateFormatter('%b')   # Use abbreviated month name
ax[1].xaxis.set_major_locator(months)
#ax[1].xaxis.set_major_formatter(mdates.DateFormatter('%m-%Y')) 
ax[1].xaxis.set_major_formatter(mdates.DateFormatter('%b-%Y')) 

ax[1].xaxis.set_tick_params(rotation=90)
#ax.xaxis.set_tick_params(rotation=30)
#ax[1].xaxis.set_major_formatter(monthFmt)
#ax[0].xaxis.set_minor_locator(days)
start       = date(year=start_y,month=start_m,day=1)
print(start)
end         = date(year=end_y,month=end_m,day=1)
print(end)
Nticks      = 6
delta       = (end-start)/Nticks
tick_dates  = [start + i*delta for i in range(Nticks)]
x_ticks     = ['{}/{}'.format(d.month,d.year) for d in tick_dates]
print(x_ticks)
plt.barh(range(len(beg_sort)), end_sort-beg_sort, left=beg_sort, align='center')
plt.yticks(range(len(beg_sort)), evt_sort)

plt.yticks(range(len(beg_sort)), evt_sort)
#plt.xticks = x_ticks
#plt.set_xticks(x_ticks)

#plt.show()
fig.delaxes(ax[0])

plt.savefig('gwern.pdf',bbox_inches='tight')

谢谢皮埃科特,干得好。谢谢发现我自己的解决方案张贴在下面,但你的更优雅。