为 Python 中多个日期的多个类别绘制堆积 (100%) 条形图
Plot stacked (100%) bar chart for multiple categories on multiple dates in Python
我有以下初始数据框:
Post 身份证
Submission_Date
天赋
0
第 1 行
01.12.2020
南
1
行 2
2020 年 12 月 3 日
讨论
2
第 3 行
2020 年 12 月 3 日
新闻
3
第 4 行
2020 年 12 月 3 日
讨论
4
第5行
2020 年 12 月 6 日
尽职调查
5
第 6 行
2020 年 12 月 7 日
讨论
6
第 7 行
2020 年 12 月 31 日
讨论
1
第 8 行
2021 年 1 月 1 日
对冲基金的眼泪
- 多个日期之间缺少日期
- 日期的多个类别
我将数据框分组为:
import pandas as pd
import numpy as np # for test data
data = {'Post ID': ['row1', 'row2', 'row3', 'row4', 'row5', 'row6', 'row7', 'row8'], 'Submission_Date': ['01.12.2020', '03.12.2020', '03.12.2020', '03.12.2020', '06.12.2020', '07.12.2020', '31.12.2020', '01.01.2021'], 'Flair': [np.nan, 'Discussion', 'News', 'Discussion', 'Due Diligence', 'Discussion', 'Discussion', 'Hedge Fund Tears']}
df = pd.DataFrame(data)
df['Submission_Date'] = pd.to_datetime(df['Submission_Date'], format = "%Y-%m-%d %H:%M:%S").dt.strftime('%Y-%m-%d')
df = df.groupby('Submission_Date')['Flair'].value_counts(normalize=True).unstack()
结果是这样的:
我想用“空”条填充日期并像这样绘制
我已经试过了:
fig, ax = plt.subplots(figsize=(20,10))
df.plot(kind='bar',ax=ax, stacked=True, width=1)
plt.xlabel('Submission_Date', fontsize=16)
plt.ylabel('Ratio of Flairs used', fontsize=16)
但日期不正确,因为没有显示空天
假设此输入为 df2
(groupby
操作的输出):
Flair Discussion Due Diligence Hedge Fund Tears News
Submission_Date
01.01.2021 NaN NaN 1.0 NaN
03.12.2020 0.666667 NaN NaN 0.333333
06.12.2020 NaN 1.0 NaN NaN
07.12.2020 1.000000 NaN NaN NaN
31.12.2020 1.000000 NaN NaN NaN
您可以 reindex
来自 pd.date_range
:
df2.index = pd.to_datetime(df2.index, format='%d.%m.%Y')
df2 = df2.reindex(pd.date_range(df2.index.min(), df2.index.max()))
df2.index = df2.index.strftime('%Y-%m-%d')
Flair Discussion Due Diligence Hedge Fund Tears News
2020-12-03 0.666667 NaN NaN 0.333333
2020-12-04 NaN NaN NaN NaN
2020-12-05 NaN NaN NaN NaN
2020-12-06 NaN 1.0 NaN NaN
2020-12-07 1.000000 NaN NaN NaN
...
2020-12-30 NaN NaN NaN NaN
2020-12-31 1.000000 NaN NaN NaN
2021-01-01 NaN NaN 1.0 NaN
图形结果(小尺寸):
我有以下初始数据框:
Post 身份证 | Submission_Date | 天赋 | |
---|---|---|---|
0 | 第 1 行 | 01.12.2020 | 南 |
1 | 行 2 | 2020 年 12 月 3 日 | 讨论 |
2 | 第 3 行 | 2020 年 12 月 3 日 | 新闻 |
3 | 第 4 行 | 2020 年 12 月 3 日 | 讨论 |
4 | 第5行 | 2020 年 12 月 6 日 | 尽职调查 |
5 | 第 6 行 | 2020 年 12 月 7 日 | 讨论 |
6 | 第 7 行 | 2020 年 12 月 31 日 | 讨论 |
1 | 第 8 行 | 2021 年 1 月 1 日 | 对冲基金的眼泪 |
- 多个日期之间缺少日期
- 日期的多个类别
我将数据框分组为:
import pandas as pd
import numpy as np # for test data
data = {'Post ID': ['row1', 'row2', 'row3', 'row4', 'row5', 'row6', 'row7', 'row8'], 'Submission_Date': ['01.12.2020', '03.12.2020', '03.12.2020', '03.12.2020', '06.12.2020', '07.12.2020', '31.12.2020', '01.01.2021'], 'Flair': [np.nan, 'Discussion', 'News', 'Discussion', 'Due Diligence', 'Discussion', 'Discussion', 'Hedge Fund Tears']}
df = pd.DataFrame(data)
df['Submission_Date'] = pd.to_datetime(df['Submission_Date'], format = "%Y-%m-%d %H:%M:%S").dt.strftime('%Y-%m-%d')
df = df.groupby('Submission_Date')['Flair'].value_counts(normalize=True).unstack()
结果是这样的:
我想用“空”条填充日期并像这样绘制
我已经试过了:
fig, ax = plt.subplots(figsize=(20,10))
df.plot(kind='bar',ax=ax, stacked=True, width=1)
plt.xlabel('Submission_Date', fontsize=16)
plt.ylabel('Ratio of Flairs used', fontsize=16)
但日期不正确,因为没有显示空天
假设此输入为 df2
(groupby
操作的输出):
Flair Discussion Due Diligence Hedge Fund Tears News
Submission_Date
01.01.2021 NaN NaN 1.0 NaN
03.12.2020 0.666667 NaN NaN 0.333333
06.12.2020 NaN 1.0 NaN NaN
07.12.2020 1.000000 NaN NaN NaN
31.12.2020 1.000000 NaN NaN NaN
您可以 reindex
来自 pd.date_range
:
df2.index = pd.to_datetime(df2.index, format='%d.%m.%Y')
df2 = df2.reindex(pd.date_range(df2.index.min(), df2.index.max()))
df2.index = df2.index.strftime('%Y-%m-%d')
Flair Discussion Due Diligence Hedge Fund Tears News
2020-12-03 0.666667 NaN NaN 0.333333
2020-12-04 NaN NaN NaN NaN
2020-12-05 NaN NaN NaN NaN
2020-12-06 NaN 1.0 NaN NaN
2020-12-07 1.000000 NaN NaN NaN
...
2020-12-30 NaN NaN NaN NaN
2020-12-31 1.000000 NaN NaN NaN
2021-01-01 NaN NaN 1.0 NaN
图形结果(小尺寸):