您的问题是 x 刻度是自动生成的,并且间隔开以便于阅读。但是,您告诉 matplotlib 使用所有标签。简单的解决方法是告诉他每个条目使用一个刻度标签,但这会使您的 x 轴不可读:
graph.set_xticks(range(len(FinalDataframe['dates'])))
现在您可以手动将它们隔开:
graph.set_xticks(range(0, len(FinalDataframe['dates']), 61))
graph.set_xticklabels(FinalDataframe['dates'][::61])
然而,在 x 轴上绘制日期的最佳结果仍然是使用 pandas 的内置日期对象。我们可以通过pd.to_datetime 做到这一点
这也将允许 pandas 知道在 x 轴上放置点的位置,方法是指定您希望 x 轴为日期。这样,如果日期未排序或丢失,将正确跳过间隙,并且点将位于正确日期的纵坐标上方。
我首先重新创建一个看起来像您发布的数据框:
>>> df = pd.DataFrame({'dates': pd.date_range('20190301', '20200221', freq='D').strftime('%d.%m.%Y'), 'numbers': np.random.randint(0, 10, 358)})
>>> df
dates numbers
0 01.03.2019 2
1 02.03.2019 2
2 03.03.2019 5
3 04.03.2019 4
4 05.03.2019 3
.. ... ...
353 17.02.2020 2
354 18.02.2020 1
355 19.02.2020 2
356 20.02.2020 3
357 21.02.2020 1
(这应该和FinalDataFrame一样,或者如果你的日期是索引,那么它和FinalDataFrame.reset_index()一样)
现在我正在转换日期:
>>> df['dates'] = pd.to_datetime(df['dates'], format='%d.%m.%Y')
>>> df
dates numbers
0 2019-03-01 2
1 2019-03-02 2
2 2019-03-03 5
3 2019-03-04 4
4 2019-03-05 3
.. ... ...
353 2020-02-17 2
354 2020-02-18 1
355 2020-02-19 2
356 2020-02-20 3
357 2020-02-21 1
您可以通过检查其dtypes 来检查您的列是否包含日期而不是日期的字符串表示:
>>> df.dtypes
dates datetime64[ns]
numbers int64
终于出图了:
>>> ax = df.plot(x='dates', y='numbers', figsize=(12, 8))
>>> ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.075), ncol=4)
<matplotlib.legend.Legend object at 0x7fc8c24fd4f0>
>>> plt.show()
图例会自动处理。这就是你得到的: