我准备了一个 Pandas DataFrame:
df = pd.read_csv("data/pm25.csv")
df['date'] = pd.to_datetime(df['date'])
start_date = pd.to_datetime("2022-01-01T00:00:00.000Z")
end_date = pd.to_datetime("2022-12-31T00:00:00.000Z")
mask = (df['date'] >= start_date) & (df['date'] <= end_date)
df = df.loc[mask]
df.set_index('date', inplace=True)
min max median q1 q3 stdev count
date
2022-01-01 00:00:00+00:00 1.63 92.83 3.99 2.87 6.13 10.013 562
2022-01-02 00:00:00+00:00 0.70 122.47 2.97 2.40 3.79 10.038 552
2022-01-03 00:00:00+00:00 0.67 41.77 2.60 1.70 3.17 3.534 555
2022-01-04 00:00:00+00:00 0.60 122.47 2.17 1.40 3.60 7.237 565
2022-01-05 00:00:00+00:00 1.10 47.30 3.37 2.97 3.85 3.410 560
... ... ... ... ... ... ... ...
2022-12-27 00:00:00+00:00 1.17 32.67 2.20 1.93 2.57 1.459 535
2022-12-28 00:00:00+00:00 0.60 2.43 1.20 1.00 1.40 0.298 491
2022-12-29 00:00:00+00:00 0.50 10.40 1.50 0.92 2.20 0.896 553
2022-12-30 00:00:00+00:00 0.60 24.13 1.90 1.07 2.60 2.120 463
2022-12-31 00:00:00+00:00 0.40 93.60 1.40 0.80 2.29 6.909 536
[363 rows x 7 columns]>
现在我想把它画成箱线图。日期(大约 365)应该显示在 x 轴上,并且每天应该有一个框。
除了 pandas 和 matplotlib,我不想使用任何其他库。如何以一种让我按照上述方式显示数据的方式选择数据?我似乎只能设法在 x 轴上显示列(最小值、最大值、中值、...)...
ax.boxplot
但你仍然可以使用 ax.bxp
。但是,您必须计算一些缺失的数据,例如 iqr
、whishi
和 whislo
。
从您的数据框中,您可以:
data = (df.set_axis(df.index.strftime('%Y-%m-%d')).reset_index()
.rename(columns={'date': 'label', 'median': 'med'})
.assign(iqr=lambda x: x['q3'] - x['q1'],
whishi=lambda x: x['q3'] + 1.5*x['iqr'],
whislo=lambda x: x['q1'] - 1.5*x['iqr'])
.to_dict('records'))
fig, ax = plt.subplots(figsize=(10, 8))
ax.bxp(data, showfliers=False)
ax.set_xticklabels(ax.get_xticklabels(), rotation=45)
plt.show()
输出: