python - 如何在python中创建具有多个x轴的条形图
问题描述
我有一个包含 3 列的数据集:BOROUGHS、COMPLAINT_DATE、OFFENSE
注意:日期格式如下:2010-01-30
我确实知道如何创建一个简单的条形图......像这样:
df.plot(kind="bar")
但是,我需要这样的东西:
这张图表告诉我 5 个行政区、投诉数量和年份。加上使用颜色。
首先,你怎么做这样的事情?第二,这种图表有名字吗?像,多条形图或类似的东西?
紫色应该是第一个……在酒吧……但它说它有更多的犯罪……
解决方案
- 数据需要按计数进行分组和聚合,然后转换为正确的形状。
- 使用
.dt
访问器从'complaint_date'
列中提取年份。
- 使用
- 请参阅
pandas.DataFrame.plot
&pandas.DataFrame.plot.bar
了解所有可用参数。
import pandas as pd
import matplotlib.pyplot as plt
# sample data
data = {'boroughs': ['x', 'y', 'z', 'x', 'y', 'z', 'x', 'y', 'z', 'x', 'y', 'z', 'x'],
'complaint_date': ['2020-11-1', '2020-11-1', '2020-11-1', '2019-11-1', '2019-11-1', '2019-11-1', '2020-11-1', '2020-11-1', '2020-11-1', '2019-11-1', '2019-11-1', '2019-11-1', '2019-11-1'],
'offense': ['a', 'b', 'c', 'a', 'b', 'c', 'd', 'e', 'f', 'd', 'e', 'f', 'd']}
# create dataframe
df = pd.DataFrame(data)
# convert date column to datetime dtype
df.complaint_date = pd.to_datetime(df.complaint_date)
# groupby year and borough to get count of offenses
dfg = df.groupby([df.complaint_date.dt.year, 'boroughs']).boroughs.count().reset_index(name='count')
# display(dfg)
complaint_date boroughs count
0 2019 x 3
1 2019 y 2
2 2019 z 2
3 2020 x 2
4 2020 y 2
5 2020 z 2
# pivot into the correct form for stacked bar
dfp = dfg.pivot(index='complaint_date', columns='boroughs', values='count')
# display(dfp)
boroughs x y z
complaint_date
2019 3 2 2
2020 2 2 2
# plot
dfp.plot.bar(stacked=True, xlabel='Year Complaint Filed', ylabel='Volumn of Complaints')
plt.legend(title='Boroughs', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.xticks(rotation=0)
对评论的回应
- 作为回应
AttributeError: 'Rectangle' object has no property 'xlabel'
pandas
可能需要更新;这是在版本中运行的1.1.3
。
# plot
dfp.plot.bar(stacked=True)
plt.legend(title='Boroughs', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.xlabel('Year Complaint Filed')
plt.ylabel('Volumn of Complaints')
plt.xticks(rotation=0)
比堆叠条更好的选择
- 利用
seaborn.barplot
- 这将为每个条形的相对值提供更好的整体表示。
import seaborn as sns
# use dfg from above
# plot
fig, ax = plt.subplots(figsize=(6, 4))
sns.barplot(y='complaint_date', x='count', data=dfg, hue='boroughs', orient='h', ax=ax)
# use log scale since you have large numbers
plt.xscale('log')
# relocate the legend
plt.legend(title='Boroughs', bbox_to_anchor=(1.05, 1), loc='upper left')
推荐阅读
- angular - 使用 Angular 8 在表中添加一行
- elasticsearch - 如何执行基于聚合的搜索?
- node.js - 成员必须满足正则表达式模式:[\\S]+
- sql-server - 根据员工的日程安排计算员工的确切分钟数
- typescript - 当 cfn 模板和使用 AWS CDK 创建的管道时,如何使用 CodePipeline 部署 CloudFormation 堆栈?
- reactjs - 删除操作的React-redux问题
- javascript - 从一个 JS 文件链接到另一个
- python - 禁用 Pyexcel 排序
- javascript - 如何在mysql db上存储文件
- scala - 为什么scala sortWith函数将Predicate作为输入