avatar

基于 Jupyter Notebook 和Plotly的交互式COVID-19实时追踪可视化系统(下)

基于 Jupyter Notebook 和Plotly的交互式COVID-19实时追踪可视化系统

3.“散点图”图表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
renamed_columns_map = {
"Country/Region": "country",
"Province/State": "location",
"Lat": "latitude",
"Long": "longitude"
}

confirmed_cases_df = (
pd.read_csv(confirmed_cases_url)
.rename(columns=renamed_columns_map)
.rename(columns=reformat_dates)
.fillna(method="bfill", axis=1)
)
deaths_df = (
pd.read_csv(deaths_url)
.rename(columns=renamed_columns_map)
.rename(columns=reformat_dates)
.fillna(method="bfill", axis=1)
)

display(confirmed_cases_df.head())
display(deaths_df.head())

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
fig = go.Figure()

geo_data_cols = ["country", "location", "latitude", "longitude"]
geo_data_df = confirmed_cases_df[geo_data_cols]
dates_list = (
confirmed_cases_df.filter(regex=r"(\d{2}/\d{2}/\d{4})", axis=1)
.columns
.to_list()
)

#创建日期的映射- >数据帧,其中每个DF持有的情况下,每个国家的死亡日常计数
cases_by_date = {}
for date in dates_list:
#得到的所有情况pd.Series当天
confirmed_cases_day_df = (
confirmed_cases_df.filter(like=date, axis=1)
.rename(columns=lambda col: "confirmed_cases")
.astype("uint32")
)

#得到所有死亡人数的pd.Series当天
deaths_day_df = (
deaths_df.filter(like=date, axis=1)
.rename(columns=lambda col: "deaths")
.astype("uint32")
)

cases_df = confirmed_cases_day_df.join(deaths_day_df) #合并案例和死亡dfs
cases_df = geo_data_df.join(cases_df) #添加地理数据
cases_df = cases_df[cases_df["confirmed_cases"] > 0] #删除没有案例的任何行

cases_by_date[date] = cases_df

#每个数据帧看起来是这样的:
cases_by_date[dates_list[-1]].head()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#生成每一天的数据
fig.data = []
for date, df in cases_by_date.items():
df["confirmed_cases_norm"] = np.log1p(df["confirmed_cases"])
df["text"] = (
date
+ "<br>"
+ df["country"]
+ "<br>"
+ df["location"]
+ "<br>Confirmed cases: "
+ df["confirmed_cases"].astype(str)
+ "<br>Deaths: "
+ df["deaths"].astype(str)
)
fig.add_trace(
go.Scattergeo(
name="",
lat=df["latitude"],
lon=df["longitude"],
visible=False,
hovertemplate=df["text"],
showlegend=False,
marker={
"size": df["confirmed_cases_norm"] * 100,
"color": "red",
"opacity": 0.75,
"sizemode": "area",
},
)
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#整理出注释和滑块步骤
annotation_text_template = "<b>Worldwide Totals</b>" \
"<br>{date}<br><br>" \
"Confirmed cases: {confirmed_cases:,d}<br>" \
"Deaths: {deaths:,d}<br>" \
"Mortality rate: {mortality_rate:.1%}"
annotation_dict = {
"x": 0.03,
"y": 0.35,
"width": 175,
"height": 110,
"showarrow": False,
"text": "",
"valign": "middle",
"visible": False,
"bordercolor": "black",
}

steps = []
for i, data in enumerate(fig.data):
step = {
"method": "update",
"args": [
{"visible": [False] * len(fig.data)},
{"annotations": [dict(annotation_dict) for _ in range(len(fig.data))]},
],
"label": dates_list[i],
}

#将第i个跟踪和注释框切换到可见
step["args"][0]["visible"][i] = True
step["args"][1]["annotations"][i]["visible"] = True

df = cases_by_date[dates_list[i]]
confirmed_cases = df["confirmed_cases"].sum()
deaths = df["deaths"].sum()
mortality_rate = deaths / confirmed_cases
step["args"][1]["annotations"][i]["text"] = annotation_text_template.format(
date=dates_list[i],
confirmed_cases=confirmed_cases,
deaths=deaths,
mortality_rate=mortality_rate,
)

steps.append(step)

sliders = [
{
"active": 0,
"currentvalue": {"prefix": "Date: "},
"steps": steps,
"len": 0.9,
"x": 0.05,
}
]

first_annotation_dict = {**annotation_dict}
first_annotation_dict.update(
{
"visible": True,
"text": annotation_text_template.format(
date="10/01/2020", confirmed_cases=44, deaths=1, mortality_rate=0.0227
),
}
)
fig.layout.title = {"text": "Covid-19 Global Case Tracker", "x": 0.5}
fig.update_layout(
height=650,
margin={"t": 50, "b": 20, "l": 20, "r": 20},
annotations=[go.layout.Annotation(**first_annotation_dict)],
sliders=sliders,
)
fig.data[0].visible = True #设置第一个数据点可见

fig

4.参考:

文章作者: CodeHao
文章链接: http://codehao.top/cl1c6w8x8002gjkla64w360e0/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 CodeHao's Blog
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论
简体中文