首页 > 解决方案 > 如何基于多个子集在同一个图中绘制多条线

问题描述

我有一个类似于以下的数据集:

SNAPSHOT_DATE   DEPLOYMENT_TYPE FORECAST_YEAR   TOTAL_WIDGETS
1/1/20               1             2020             206457
1/1/20               1             2021              70571
1/1/20               1             2022              46918
1/1/20               1             2023              36492
1/1/20               1             2024                  0
1/1/20               1             2025                  0
2/1/20               1             2020             207177
2/1/20               1             2021              71947
2/1/20               1             2022              46918
2/1/20               1             2023              36492
2/1/20               1             2024                  0
2/1/20               1             2025                  0
3/1/20               1             2020             242758
3/1/20               1             2021             102739
3/1/20               1             2022              43174
3/1/20               1             2023              32956
3/1/20               1             2024                  0
3/1/20               1             2025                  0
1/1/20               2             2020             286616
1/1/20               2             2021             134276
1/1/20               2             2022              87674
1/1/20               2             2023                240
1/1/20               2             2024                  0
1/1/20               2             2025                  0
2/1/20               2             2020              308145
2/1/20               2             2021              132996
2/1/20               2             2022               87674
2/1/20               2             2023                 240
2/1/20               2             2024                   0
2/1/20               2             2025                   0
3/1/20               2             2020              218761
3/1/20               2             2021              178594
3/1/20               2             2022               87674
3/1/20               2             2023                 240
3/1/20               2             2024                   0
3/1/20               2             2025                   0

我希望能够为每种部署类型绘制图,y 轴上的 Total Widgets 和 x 轴上的月份(20 年 1 月 1 日 - 20 年 12 月 1 日)然后在图中为每个预测的 2020 年包含一条单独的线- 2025 年。我怎样才能最好地做到这一点?我的第一个想法是根据日期范围和预测年份过滤每种部署类型,如下所示:

forecastchanges_widgets2020 = data.loc[((data['DEPLOYMENT_TYPE'] =='1') & (data['Date'] >= '2020-01-01') & (data['Date'] <= '2020-12-01')) & (data['FORECAST_YEAR'] =='2020')]

并绘制每一行,但这意味着我需要为每个部署类型中包含的每一年重复这一点。必须有更好的方法来实现所需的情节吗?

这个问题/答案不符合我的要求,因为我需要将每种部署类型分离到自己的图中,然后'total_widgets'在 x 轴上跨月日期绘制每年的值

标签: pythonpandasmatplotlibseaborn

解决方案


  • 对于这种情况,sns.relplot将工作
  • 给定您的数据框data
    • data仅包含'SNAPSHOT'年份为 2020 年的信息,但是,对于完整的数据集,在'Snapshot_Year'.
  • 由于每行图的 x 轴都不同facet_kws={'sharex': False}),因此xlim可以根据年份的日期范围进行缩放。
import pandas as pd
import seaborn as sns

# convert SNAPSHOT_DATE to a datetime dtype
data.SNAPSHOT_DATE = pd.to_datetime(data.SNAPSHOT_DATE)

# add the snapshot year as a new column
data.insert(1, 'Snapshot_Year', data.SNAPSHOT_DATE.dt.year)

# plot the data
g = sns.relplot(data=data, col='DEPLOYMENT_TYPE', row='Snapshot_Year', x='SNAPSHOT_DATE', y='TOTAL_WIDGETS',
                hue='FORECAST_YEAR', kind='line', facet_kws={'sharex': False})
g.set_xticklabels(rotation=90)
plt.tight_layout()

在此处输入图像描述


推荐阅读