我想跟踪公司每个机构中新的covid19病例数,这是每日时间序列。我想看看如何使用精美的EDA图实时跟踪covid19的新案例。我尝试matplotlib
在一页中为每个公司绘制直方图,但无法正确地绘制出一张。谁能指出我的正确做法?有什么想法吗?
可复制的数据:
以下是可重现的covid19跟踪时间序列数据in this gist。在此数据中,est
是指establishment code
,因此每个不同的公司可能都有多个公司代码。
我的尝试
这是我对seaborns和matplotlib的尝试:
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import seaborn as sns
from datetime import timedelta, datetime
bigdf = pd.read_csv("coviddf.csv")
markers = {"new_case_sum": "s", "est_company": "X"}
for t in bigdf.company.unique():
grouped = bigdf[bigdf.company==t]
res = grouped.groupby(['run_date','county-state', 'company'])['new'].sum().unstack().reset_index('run_date')
f, axes = plt.subplots(nrows=len(bigdf.company), ncols= 1, figsize=(20, 7), squeeze=False)
for j in range(len(bigdf.company)):
p = sns.scatterplot('run_date', 'new', data=res, hue='company', markers=markers, style='cats', ax=axes[j, 0])
p.set_title(f'Threshold: {t}\n{pt}')
p.set_xlim(data['run_date'].min() - timedelta(days=60), data['run_date'].max() + timedelta(days=60))
plt.legend(bbox_to_anchor=(1.04, 0.5), loc="center left", borderaxespad=0)
但是我无法获得正确的情节。我认为我已经为绘制数据进行了正确的数据聚合,但是以某种方式我使用了错误的数据属性来绘制图表。谁能告诉我我的错误在哪里?谁能建议更好的方法来实现这一目标?有想法吗?
所需的情节
理想情况下,我想渲染类似此结构的图(附加的所需图只是来自其他站点的参考):
有人可以建议如何使我的上述方法正确吗?有没有更好的建议来制作更好的时间序列图以进行共视频跟踪?谢谢
更新:
在尝试中,我尝试汇总每个公司中所有机构的新案件编号,然后制作折线图或直方图。我们如何在一页图中按日期在每个公司的所有已确认,死亡和所有机构的新案例(也称为est
列)中制作折线图?有什么想法可以实现吗?
答案 0 :(得分:2)
sns.FacetGrid
和sns.barplot
<div>
,每列将是<template>
<div>
<v-file-input
v-model="file"
label="File input"
id="file"
ref="file"
></v-file-input>
<button :disabled="!file" type="button" @click="submitFile">Submit</button>
</div>
</template>
,每个company
。
barplot
。我添加了额外的数据,所以会有两个日期。est
将是run_date
,hue
和val
的{{1}}。.stack
用于groupby
,将new
,confirmed
和dead
堆叠到一列。new
confirmed
的示例,dead
import pandas as pd
import seaborn as sns
# load and clean data
df = pd.read_csv("https://gist.githubusercontent.com/jerry-shad/318595505684ea4248a6cc0949788d33/raw/31bbeb08f329b4b96605b8f2a48f6c74c3e0b594/coviddf.csv")
df.drop(columns=['Unnamed: 0'], inplace=True) # drop this extra column
df.run_date = pd.to_datetime(df.run_date) # set run_date to a datetime format
# plot
for g, d in df.groupby(['company']):
data = d.groupby(['run_date','county-state', 'company', 'est'], as_index=True).agg({'new': sum, 'confirmed': sum, 'death': sum}).stack().reset_index().rename(columns={'level_4': 'type', 0: 'val'})
# display(data) # if you're not using Jupyter, change display to print
# print('\n')
print(f'{g}')
g = sns.FacetGrid(data, col='est', sharex=False, sharey=False, height=5, col_wrap=4)
g.map(sns.barplot, 'run_date', 'val', 'type', order=data.run_date.dt.date.unique(), hue_order=data['type'].unique())
g.add_legend()
g.set_xticklabels(rotation=90)
g.set(yscale='log')
plt.tight_layout()
plt.show()
groupby