如何使用python中的matplotlib制作正确的covid跟踪时间序列图?

时间:2020-08-31 03:58:52

标签: python matplotlib plotly seaborn

我想跟踪公司每个机构中新的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)

但是我无法获得正确的情节。我认为我已经为绘制数据进行了正确的数据聚合,但是以某种方式我使用了错误的数据属性来绘制图表。谁能告诉我我的错误在哪里?谁能建议更好的方法来实现这一目标?有想法吗?

所需的情节

理想情况下,我想渲染类似此结构的图(附加的所需图只是来自其他站点的参考):

enter image description here

有人可以建议如何使我的上述方法正确吗?有没有更好的建议来制作更好的时间序列图以进行共视频跟踪?谢谢

更新

在尝试中,我尝试汇总每个公司中所有机构的新案件编号,然后制作折线图或直方图。我们如何在一页图中按日期在每个公司的所有已确认,死亡和所有机构的新案例(也称为est列)中制作折线图?有什么想法可以实现吗?

1 个答案:

答案 0 :(得分:2)

  • 以下代码将使用sns.FacetGridsns.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
    • x轴将为barplot。我添加了额外的数据,所以会有两个日期。
    • y轴和est将是run_datehueval的{​​{1}}。
  • .stack用于groupby,将newconfirmeddead堆叠到一列。
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()

示例图

enter image description here

使用地理数据绘图

groupby

enter image description here