使用 pandas 和 matplotlib 以及 YearLocator 绘图时显示不正确的年份

问题描述 投票:0回答:1

我有以下代码(见下文),我尝试在其中绘制每月订单。它工作得很好,但是,我试图设置每年的主要刻度,但我最终只得到了 1970 年的一年。我不太确定我错过了什么以及为什么它会这样。我做错了什么?

from pandas import Timestamp
test_data = pd.Series({Timestamp('2016-10-31 00:00:00'): 1052,
 Timestamp('2016-11-30 00:00:00'): 942,
 Timestamp('2016-12-31 00:00:00'): 791,
 Timestamp('2017-01-31 00:00:00'): 982,
 Timestamp('2017-02-28 00:00:00'): 647,
 Timestamp('2017-03-31 00:00:00'): 966,
 Timestamp('2017-04-30 00:00:00'): 1289,
 Timestamp('2017-05-31 00:00:00'): 504,
 Timestamp('2017-06-30 00:00:00'): 496,
 Timestamp('2017-07-31 00:00:00'): 776,
 Timestamp('2017-08-31 00:00:00'): 869,
 Timestamp('2017-09-30 00:00:00'): 617,
 Timestamp('2017-10-31 00:00:00'): 1601,
 Timestamp('2017-11-30 00:00:00'): 1094,
 Timestamp('2017-12-31 00:00:00'): 1405,
 Timestamp('2018-01-31 00:00:00'): 1377,
 Timestamp('2018-02-28 00:00:00'): 921,
 Timestamp('2018-03-31 00:00:00'): 1229,
 Timestamp('2018-04-30 00:00:00'): 1374,
 Timestamp('2018-05-31 00:00:00'): 1045,
 Timestamp('2018-06-30 00:00:00'): 1222,
 Timestamp('2018-07-31 00:00:00'): 1119,
 Timestamp('2018-08-31 00:00:00'): 1610,
 Timestamp('2018-09-30 00:00:00'): 1525,
 Timestamp('2018-10-31 00:00:00'): 2160,
 Timestamp('2018-11-30 00:00:00'): 2414,
 Timestamp('2018-12-31 00:00:00'): 2004,
 Timestamp('2019-01-31 00:00:00'): 1751,
 Timestamp('2019-02-28 00:00:00'): 1069,
 Timestamp('2019-03-31 00:00:00'): 1524,
 Timestamp('2019-04-30 00:00:00'): 1758,
 Timestamp('2019-05-31 00:00:00'): 1568,
 Timestamp('2019-06-30 00:00:00'): 1221,
 Timestamp('2019-07-31 00:00:00'): 1097,
 Timestamp('2019-08-31 00:00:00'): 1671,
 Timestamp('2019-09-30 00:00:00'): 1212,
 Timestamp('2019-10-31 00:00:00'): 2468,
 Timestamp('2019-11-30 00:00:00'): 2591,
 Timestamp('2019-12-31 00:00:00'): 2516,
 Timestamp('2020-01-31 00:00:00'): 1842,
 Timestamp('2020-02-29 00:00:00'): 1704,
 Timestamp('2020-03-31 00:00:00'): 2314,
 Timestamp('2020-04-30 00:00:00'): 5300,
 Timestamp('2020-05-31 00:00:00'): 5499,
 Timestamp('2020-06-30 00:00:00'): 3815,
 Timestamp('2020-07-31 00:00:00'): 2368,
 Timestamp('2020-08-31 00:00:00'): 2844,
 Timestamp('2020-09-30 00:00:00'): 2269,
 Timestamp('2020-10-31 00:00:00'): 3138,
 Timestamp('2020-11-30 00:00:00'): 4584,
 Timestamp('2020-12-31 00:00:00'): 3674,
 Timestamp('2021-01-31 00:00:00'): 4831,
 Timestamp('2021-02-28 00:00:00'): 2978,
 Timestamp('2021-03-31 00:00:00'): 3318,
 Timestamp('2021-04-30 00:00:00'): 3477,
 Timestamp('2021-05-31 00:00:00'): 2601,
 Timestamp('2021-06-30 00:00:00'): 2134,
 Timestamp('2021-07-31 00:00:00'): 1709,
 Timestamp('2021-08-31 00:00:00'): 2663,
 Timestamp('2021-09-30 00:00:00'): 1877,
 Timestamp('2021-10-31 00:00:00'): 2210,
 Timestamp('2021-11-30 00:00:00'): 4441,
 Timestamp('2021-12-31 00:00:00'): 2782,
 Timestamp('2022-01-31 00:00:00'): 3666,
 Timestamp('2022-02-28 00:00:00'): 2546,
 Timestamp('2022-03-31 00:00:00'): 2207,
 Timestamp('2022-04-30 00:00:00'): 2881,
 Timestamp('2022-05-31 00:00:00'): 2682,
 Timestamp('2022-06-30 00:00:00'): 2550,
 Timestamp('2022-07-31 00:00:00'): 2362,
 Timestamp('2022-08-31 00:00:00'): 2834,
 Timestamp('2022-09-30 00:00:00'): 3012,
 Timestamp('2022-10-31 00:00:00'): 3425,
 Timestamp('2022-11-30 00:00:00'): 5092,
 Timestamp('2022-12-31 00:00:00'): 3289,
 Timestamp('2023-01-31 00:00:00'): 3719,
 Timestamp('2023-02-28 00:00:00'): 2788,
 Timestamp('2023-03-31 00:00:00'): 3499,
 Timestamp('2023-04-30 00:00:00'): 3493,
 Timestamp('2023-05-31 00:00:00'): 3402,
 Timestamp('2023-06-30 00:00:00'): 2828,
 Timestamp('2023-07-31 00:00:00'): 3525,
 Timestamp('2023-08-31 00:00:00'): 3739,
 Timestamp('2023-09-30 00:00:00'): 3278,
 Timestamp('2023-10-31 00:00:00'): 3548,
 Timestamp('2023-11-30 00:00:00'): 5150,
 Timestamp('2023-12-31 00:00:00'): 4719,
 Timestamp('2024-01-31 00:00:00'): 4679,
 Timestamp('2024-02-29 00:00:00'): 3222,
 Timestamp('2024-03-31 00:00:00'): 3374,
 Timestamp('2024-04-30 00:00:00'): 1421}, name="Monthly orders")

plot = test_data.plot(kind="bar",
               title="Monthly orders")

plot.xaxis.set_major_locator(mdates.YearLocator())  # Locate years
plot.xaxis.set_major_formatter(mdates.DateFormatter('%Y'))  # Year format

代码结果:

enter image description here

python pandas matplotlib
1个回答
0
投票

考虑恢复为

matplotlib.axes.Axes.bar
而不是
pandas.DataFrame.plot
,这样可以更好地处理 x 轴格式,而无需太多解决方法:

import pandas as pd
from pandas import Timestamp

import matplotlib.dates as mdates
import matplotlib.pyplot as plt

test_data = pd.Series(...)

fig, ax = plt.subplots(figsize=(12,5))
ax.bar(test_data.index, test_data, width=30, edgecolor=['b']*test_data.size)

ax.xaxis.set_major_locator(mdates.YearLocator())          # Locate years
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y'))  # Year format

plt.suptitle("Monthly Orders", fontsize=16)
plt.tight_layout()
plt.show()
plt.close()

Plot output

© www.soinside.com 2019 - 2024. All rights reserved.