Python 3.x 如何在matplotlib绘图中包括第一个/最后一个日期

Python 3.x 如何在matplotlib绘图中包括第一个/最后一个日期,python-3.x,numpy,matplotlib,plot,Python 3.x,Numpy,Matplotlib,Plot,我在jupyter笔记本中使用matplotlib绘制了一个时间序列图 将numpy导入为np 将matplotlib.pyplot作为plt导入 从numpy.polymone导入多项式作为P 起始日期时间导入日期 首先,我创建初始绘图并描述x和y: fig,ax=plt.子批次(1,1,dpi=200) 日期=['2017-08','2017-09','2017-10','2017-11','2017-12','2018-01', '2018-02', '2018-03', '2018-0

我在jupyter笔记本中使用matplotlib绘制了一个时间序列图

将numpy导入为np
将matplotlib.pyplot作为plt导入
从numpy.polymone导入多项式作为P
起始日期时间导入日期
首先,我创建初始绘图并描述x和y:

fig,ax=plt.子批次(1,1,dpi=200)
日期=['2017-08','2017-09','2017-10','2017-11','2017-12','2018-01',
'2018-02', '2018-03', '2018-04', '2018-05', '2018-06', '2018-07',
'2018-08', '2018-09', '2018-10', '2018-11', '2018-12', '2019-01',
'2019-02', '2019-03', '2019-04', '2019-05', '2019-06', '2019-07']
y=[2002、2630、2032、1816、1867、2282、2064、2316、2391、2134、1833、1982、2053、1836、2107、1891、1729、1794、1908、2267、2194、2248、2216、2408,]
#在此转换为顺序日期,以便更容易计算x次多项式
x=list(映射(lambda x:date.fromsoformat(f'{x}-01').toordinal(),dates))
其次,我在绘图中添加了两条直线(直线和多边形拟合):

#绘制线条
线,=ax.plot(x,y,'k',线宽=3,label='some SO answers')
#创建二次多项式级数实例
c1=P多项式拟合(x,y,2)
#返回域中n个线性间隔点处的x、y值。
x1,y1=c1.linspace(n=len(x))
poly2,=最大图(x1,y1,'r',线宽=3,标签='2度多边形拟合')
#创建标签并调用集合标签
#我想这就是问题所在。
#如何设置x记号以包括第一个/最后一个日期?
新标签=[date.fromordinal(int(xt))表示ax.get_xticks()中的xt
ax.设置标签(新标签)
#使情节看起来更好,添加图例
ax.xaxis.set_tick_参数(旋转=30,标签大小=8)
第一个图例=ax.legend(句柄=[line,poly2],loc='best')
请参见下面的输出,它似乎隐藏了第一个/最后一个日期。请注意,输出中x上的最后一个数据点是“2019-05”,但实际上是“2019-07”。最好包括最后一个日期,以便清楚数据是最新的。matplotlib必须使用一些规则来计算XTick。如何让XTICK尊重第一次/最后一次约会


当我检查
ax.get_xticks()
的值时,我注意到
x
的最小/最大值未包括在内。因此,难怪他们没有出现。为了实现这一点,我只需使用
np.linspace
重新创建一个包含
x
最小/最大值的序数数组

要查看先前设置的
xticks
,我们可以运行:

print(ax.getxticks())#[736500.736600.736700.736800.736900.737000.737100.737200.737300]
我们可以验证未包括最小/最大值:
print(f'min:{min(x)}max:{max(x)}')#min:736542 max:737241
我们想要的是在指定间隔上以最小值(x)开始并以最大值(x)结束的均匀间隔阵列:
#创建新的序数数组
x_ticks=np.linspace(min(x)、max(x)、num=6)#[736542.736681.8 736821.6 736961.4 737101.2 737241]
#现在设置xtick,以便使用正确的值计算新的_标签数组
ax.设置x刻度(x刻度)
#创建新标签
新标签=[date.fromordinal(int(xt)).strftime(“%b%Y”),用于ax.Getxticks()中的xt
#[‘2017年8月’、‘2017年12月’、‘2018年5月’、‘2018年9月’、‘2019年2月’、‘2019年7月’]
#设置标签
ax.设置标签(新标签)

哦,我想我已经明白了。首先使用
np.linspace(min(x),max(x),num=6)在指定的间隔上创建均匀间隔的数组
然后调用
ax.setxticks()
,输出结果。除了现在,刻度可以减少一个月(略少于一个月)。即2017年8月可在8月1日勾选,2019年7月可在7月30日勾选。