第一篇实践了画某一省份或城市的数据图,本篇尝试通过函数的形式,展示多个国家/地区的对比图,灵活性更高。
第一篇指路:
数据可视化:Python+Plotly绘制新冠疫情走势图(一)
通过函数快速绘制指定省/市的数据图
写一个函数判断传入的是省份还是城市
#函数学的不太好,经常弄不清需要return什么值,写的逻辑和格式不好请见谅,至少功能是可以实现了
#由于省和市需要用到的数据列不同,因此首先需要写一个判断输入的是省还是市的函数,定义为if_is_Province
def if_is_Province(x):
if x in df['provinceName'].tolist():#如果传入的是省名,则从province相关列里取数
df_pro = df.loc[df['provinceName']== x ].sort_values(by='updateTime',ascending=False).drop_duplicates(subset='时间',inplace=False)#去除重复数据
df_pro.set_index('时间',inplace=True)#将时间设置为索引
df_pro.sort_values(by='时间',inplace=True)#按时间升序
#增加死亡率和治愈率两列数据 df_pro['deathrate']=df_pro['province_deadCount']/df_pro['province_confirmedCount']
df_pro['curedrate']=df_pro['province_curedCount']/df_pro['province_confirmedCount']
#将需要用到的数据存下来
date = df_pro.index
confirmedCount = df_pro['province_confirmedCount']
deadCount = df_pro['province_deadCount']
curedCount = df_pro['province_curedCount']
deathrate = df_pro['deathrate']
curedrate = df_pro['curedrate']
if x in df['cityName'].tolist():#如果传入的是市名,则从city相关列里取数
df_city = df.loc[df['cityName']== x ].sort_values(by='updateTime',ascending=False).drop_duplicates(subset='时间',inplace=False)
df_city.set_index('时间',inplace=True)
df_city.sort_values(by='时间',inplace=True)
date = df_city.index.tolist()
#增加死亡率和治愈率两列数据
df_city['deathrate']=df_city['city_deadCount']/df_city['city_confirmedCount']
df_city['curedrate']=df_city['city_curedCount']/df_city['city_confirmedCount']
#将需要用到的数据存下来
confirmedCount = df_city['city_confirmedCount']
deadCount = df_city['city_deadCount']
curedCount = df_city['city_curedCount']
deathrate = df_city['deathrate']
curedrate = df_city['curedrate']
#函数的返回值
return date, confirmedCount, deadCount, curedCount,deathrate,curedrate
写一个函数快速绘制出指定省/市的数据图
def ProvinceOrCity_data(x):
date, confirmedCount, deadCount, curedCount,deathrate,curedrate = if_is_Province(x)#调用判断省市的函数,取出对应的值
trace1 = go.Scatter(x = date,y = confirmedCount,mode='lines+text',name='累计确诊数',)
trace2 = go.Scatter(x = date,y = deadCount,mode='lines+text',name='死亡人数',
xaxis='x', yaxis='y2',)
data1 = [trace1,trace2]
#设置图层信息
layout = go.Layout(yaxis2=dict(anchor='x', overlaying='y', side='right',title='死亡人数',),
title = dict(text = '{}疫情数据'.format(x),
xanchor = 'auto',),
legend=dict(x=1.1,y=1),
xaxis = dict(title='时间',tickangle=-45,),
yaxis = dict(title='累计确诊数'),
width=1000,
height=800
)
fig = go.Figure(data = data1,layout = layout)
#加一张治愈率的图
fig.add_scatter(x = date,y = curedCount,mode='lines+text',name='治愈数',)
py.iplot(fig)
查看函数返回结果
ProvinceOrCity_data('北京市')
ProvinceOrCity_data('黄石')
通过函数对比多个省市累计确诊数据图
#可传入多个参数
def province_vs_data_confirmedCount(*x):
data1 = []
for i in x:
date, confirmedCount, deadCount, curedCount,deathrate,curedrate = if_is_Province(i)
trace = go.Scatter(x = date,y = confirmedCount,mode='lines+text',name='{}累计确诊数'.format(i),)
#将data1变成多个trace的列表
data1.append(trace)
#设置图层信息
layout = go.Layout(
title = dict(text = '国家/省/市数据对比',
xanchor = 'auto',),
legend=dict(x=1.1,y=1),
xaxis = dict(title='时间',tickangle=-45,),
yaxis = dict(title='累计确诊数'))
fig = go.Figure(data = data1,layout = layout)
py.iplot(fig)
查看函数返回结果
province_vs_data_confirmedCount('北京市','上海市','广州')
对比其他国家和中国任意省/市的数据
观察df数据发现,除中国外,其他国家仅有一条整体数据,无省市数据,因此除中国外的其他国家,相当于在provincename中检索,因此此函数还可以用于对比其他国家和中国/中国某省市的数据
查看函数返回结果
#国外其他国家对比
province_vs_data_confirmedCount('美国','意大利','西班牙','德国','法国')
#国内某城市和国外其他国家对比
province_vs_data_confirmedCount('美国','意大利','武汉','韩国','日本')
通过函数对比多个国家地区死亡率数据图
def province_vs_data_deathRate(*x):
data1 = []
for i in x:
date, confirmedCount, deadCount, curedCount,deathrate,curedrate = if_is_Province(i)
trace = go.Scatter(x = date,y = deathrate,mode='lines+text',name='{}死亡率'.format(i),
)
data1.append(trace)
layout = go.Layout(
title = dict(text = '国家/地区数据对比',
xanchor = 'auto',),
legend=dict(x=1.1,y=1),
xaxis = dict(title='时间',tickangle=-45,),
yaxis = dict(title='死亡率'),
width=1000,
height=800
)
fig = go.Figure(data = data1,layout = layout)
py.iplot(fig)
查看函数返回值
#观察原数据发现,中国整体的数据只有3.15之后才有,3.15之前只有各省份的数据
province_vs_data_deathRate('美国','意大利','中国','德国')