X 轴上有日期的箱线图时间序列

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

我准备了一个 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 轴上显示列(最小值、最大值、中值、...)...

python pandas matplotlib data-science boxplot
1个回答
1
投票

当你使用聚合数据时,你不能使用

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()

输出:

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