pyecharts 疫情可视化数据可视化(二)
因为之前写的接口改了,更新了下
一:数据准备阶段
此次数据所有来源均从这两个地方得到
1.腾讯各省份市的疫情接口
2.腾讯疫情历史每日数据接口和国外疫情数据接口
二:工具和环境
IDE:Pycharm
第三方模块
1.json 主要功能:处理接口数据
2.requests 主要功能:获取接口数据
3.pandas 主要功能:将数据保存为csv
4.datetime 主要功能:文件保存时间
5.pyecahrts 主要功能:数据可视化制作地图等 版本1.7.0
6.flask 主要功能:web展示
环境 python3.7
浏览器:Chrome浏览器
三 绘制地图
获取数据方法
返回的是数据需要进行转换 json.loads方法是把json对象转化为python对象
def getdata(self):r = requests.get(self.url).json()data = json.loads(r['data'])return data
1.多国累计确诊趋势折线图
lines =(Line().add_xaxis([x.strftime('%Y-%m-%d') for x in list(pd.date_range(start='2020-02-25', end=datetime.date.today()))]).add_yaxis('伊朗',y_axis=list(df_yilang['confirm'])[6:]).add_yaxis('加拿大',list(df_jianada['confirm'])[28:]).add_yaxis('德国',list(df_deguo['confirm'])[28:]).add_yaxis('意大利',list(df_yidali['confirm'])[25:]).add_yaxis('日本本土',list(df_ribenbentu['confirm'])[28:]).add_yaxis('法国',list(df_faguo['confirm'])[28:]).add_yaxis('美国',list(df_meiguo['confirm'])[28:]).add_yaxis('英国',list(df_yingguo['confirm'])[25:]).add_yaxis('西班牙',list(df_xibanya['confirm'])[24:]).add_yaxis('韩国',list(df_hanguo['confirm'])[28:]).set_global_opts(title_opts = opts.TitleOpts(title='多国累计确诊趋势'),datazoom_opts= opts.DataZoomOpts(is_show=True,#显示is_realtime=True,#拖动时,是否实时更新系列的视图。如果设置为 false,则只在拖拽结束的时候更新。range_end= 60, # 数据窗口范围的结束百分比。),tooltip_opts= opts.TooltipOpts(is_show=True,trigger='axis', #坐标轴触发,主要在柱状图和折线图使用trigger_on='mousemove|click', #同时鼠标移动和点击时触发。),# toolbox_opts=opts.ToolboxOpts(# is_show=True, # 是否显示提示框组件,包括提示框浮层和axisPointer。# )).render('./templates/多国累计确诊趋势折线图.html'))
这里面要注意的是x轴的数据必须是str类型不然会画出来的图有问题,亲测。呜呜呜呜
.add_xaxis([x.strftime('%Y-%m-%d') for x in list(pd.date_range(start='2020-02-25', end=datetime.date.today()))])
这行代码是 列表推导式生成一个时间段的有序数列,利用pandas里面的data_range
效果图

2.全球历史每日信息折线图
参数可以自己选择
"""name conrirm 确诊数heal 治愈dead 死亡addcnfirm 增加确诊数"""def globalDailyHistory(self, name):data = self.getdata()print(name)newAddConfirmList = []for i in data['globalDailyHistory'][:-1]:item = {'date': i['date'],name: i['all'][name]}newAddConfirmList.append(item)df = pd.DataFrame(newAddConfirmList)print(df)line = (Line().add_xaxis(list(df['date'])).add_yaxis(series_name=name, y_axis=list(df[name])).set_global_opts(title_opts=opts.TitleOpts(title='全球历史%s信息(不包括中国)'%name),datazoom_opts=opts.DataZoomOpts(is_show=True, #is_realtime=True, # 拖动时,是否实时更新系列的视图。如果设置为 false,则只在拖拽结束的时候更新。range_end=80, # 数据窗口范围的结束百分比。range_start=50),tooltip_opts=opts.TooltipOpts(is_show=True,trigger='axis', # 坐标轴触发,主要在柱状图和折线图使用trigger_on='mousemove|click', # 同时鼠标移动和点击时触发。),).render('./templates/全球历史{}信息.html'.format(name)))


中国现有确诊人数地图
data = self.getdata()province_list = []for i in data['importStatis']['TopList']:item = {'province':i['province'],'importedCase':i['importedCase']}province_list.append(item)df = pd.DataFrame(province_list)print(df)map = (Map(init_opts=opts.InitOpts(width="1500px", height="1500px", theme=ThemeType.DARK)) #地图规格 init_opts=opts.InitOpts(width='1000', height='1000').add('中国',[list(z) for z in zip(list(df["province"]), list(df['importedCase']))],'china',is_map_symbol_show=False,).set_global_opts(title_opts= opts.TitleOpts('中国省份现有全确诊人数'),visualmap_opts=opts.VisualMapOpts(max_=200, #显示颜色is_piecewise=True, # 颜色是否分段显示(False为渐变,True为分段)),tooltip_opts=opts.TooltipOpts(is_show=True, # 显示trigger_on='mousemove|click', # 鼠标点击或者移动到出现具体的数值),).render('./templates/中国省份现有全确诊人数.html'))
没啥好说的就是提取数据进行处理然后map画图即可,参数也给标注了

4今日新增国家确诊前十Bar(X-Y轴互换)
参数 .reversal_axis() #翻转xy轴
data = self.getdata()countryList = []for i in data['countryAddConfirmRankList']:item = {'nation':i['nation'],'addConfirm':i['addConfirm']}countryList.append(item)df = pd.DataFrame(countryList)#Bar翻转xy轴bar = (Bar().add_xaxis(list(df['nation'])).add_yaxis('国家新增数量',list(df['addConfirm'])).reversal_axis() #翻转xy轴.set_series_opts(label_opts=opts.LabelOpts(position="right")).set_global_opts(title_opts=opts.TitleOpts(title="今日新增国家数量")).render("./templates/今日国家新增数量.html"))

5各大洲柱状图bar(stack)图
需要注意的是
stack是进行堆放在一起的stack1堆放一个,stack2等于二个
嗯 就是这样
statisList = []for i in data['continentStatis'][1:]:item = {'date':i['date'],'亚洲':i['statis']['亚洲'] ,'其他':i['statis']['其他'],'北美洲':i['statis']['北美洲'],'大洋洲':i['statis']['大洋洲'],'欧洲':i['statis']['欧洲'],'非洲':i['statis']['非洲'] if i['statis'].get('非洲') else 0,'南美洲':i['statis']['南美洲'] if i['statis'].get('南美洲') else 0,}statisList.append(item)df = pd.DataFrame(statisList)bar_stack = (Bar().add_xaxis(list(df['date'])).add_yaxis('亚洲',list(df['亚洲']),stack='stack1').add_yaxis('其他',list(df['其他']),stack='stack1').add_yaxis('北美洲',list(df['北美洲']),stack='stack1').add_yaxis('大洋洲',list(df['大洋洲']),stack='stack1').add_yaxis('欧洲',list(df['欧洲']),stack='stack1').add_yaxis('南美洲',list(df['南美洲']),stack='stack1').add_yaxis('海外现有确诊',[1718,6210,23190,67493,201196,503530]).set_series_opts(label_opts=opts.LabelOpts(is_show=False)).set_global_opts(title_opts=opts.TitleOpts(title="海外现有确诊及各洲累计确诊周比"),tooltip_opts=opts.TooltipOpts(is_show=True,trigger='axis', # 坐标轴触发,主要在柱状图和折线图使用trigger_on='mousemove|click', # 同时鼠标移动和点击时触发。)).render("./templates/各大洲柱状图.html"))

嗯 到了今天的压轴的图了,其实也不是啥别的。就是他长 emmm 细品(容我皮下)
不啰嗦,直接正题
6世界地图和table格式显示
数据准备
有些东西可以自己添加,看自己需求。
item = {'国家中':i['name'], # 国家'国家英':item_contry[i['name']] if i['name'] in item_contry else i['name'], # 如果没有国家英就显示原来的名字# '大洲':i['continent'], # 大洲# '日期':i['date'], # 日期# '是否更新':i['isUpdated'], # 是否更新'新增确诊':i['confirmAdd'], # 新增确诊# '确认':i['confirmAddCut'], #确认'总确诊':i['confirm'], # 总确诊'疑似':i['suspect'], # 疑似'死亡':i['dead'], # 死亡'治愈':i['heal'], # 治愈'现有确诊':i['confirm'], # 现有确诊# '证实':i['confirmCompare'], # 证实# '新增证实':i['nowConfirmCompare'], # 新增证实# '治愈证实':i['healCompare'], #治愈证实# '死亡证实':i['deadCompare'], # 死亡证实}countryList.append(item)countryList.append(getchinadata())df = pd.DataFrame(countryList)
'国家英':item_contry[i['name']] if i['name'] in item_contry else i['name'], # 如果没有国家英就显示原来的名字
自己定义了一个中英国家字典,但是因为像 钻石公主号这样 的没有就要加个if 语句了
6世界地图
pieces 里面是自定义显示颜色,我换个颜色累死了。你们肯定比我厉害。
map =(Map(init_opts=opts.InitOpts(width="1500px", height="1500px", theme=ThemeType.DARK)).add("国家", [list(z) for z in zip(list(df['国家英']),list(df['总确诊']))], "world").set_series_opts(label_opts=opts.LabelOpts(is_show=False)).set_global_opts(title_opts=opts.TitleOpts(title='世界疫情确诊地图'), # 标题visualmap_opts=opts.VisualMapOpts(max_=500000,is_piecewise=True, # 颜色是否分段显示(False为渐变,True为分段)pieces=[{"min": 1, "max": 10, "label": "1-10人以下", "color": "#FFE6BE"},{"min": 10, "max": 49, "label": "10-49人", "color": "#FFB769"},{"min": 50, "max": 99, "label": "50-99人", "color": "#FF8F66"},{"min": 100, "max": 499, "label": "100-499人", "color": "#ED514E"},{"min": 500, "max": 999, "label": "500-999人", "color": "#CA0D11"},{"min": 1000, "max": 9999, "label": "1000-9999人", "color": "#C23531"},{"min": 10000, "max": '', "label": "10000>人", "color": "#C80000"},]),#根据颜色进行区分tooltip_opts=opts.TooltipOpts( is_show=True, # 显示trigger_on='mousemove|click',) # 鼠标点击或者移动到出现具体的数值))# .render('./html文件/各国数据(%s).html'%(datetime.date.today())))
表格展示
headers = df.columns.to_list()rows = list(df.values)# print(rows)table = (Table().add(headers,rows).set_global_opts(title_opts=opts.ComponentTitleOpts(title="Table")))
是不是发现没有render生成html文件。其实我是故意。
pyecharts里面可以绘制进行组合图标绘制
page = Page(layout=Page.DraggablePageLayout)page.add(map,table,)page.render('./templates/各国数据(%s).html'%(datetime.date.today()))


这就就连在了一起。
四:总结
pyecharts是个很好的可视化库pyecharts中文网站
也有demo
五:falsk展示
Flask是由python实现的一个web微框架,让我们可以使用Python语言快速实现一个网站或Web服务。
我们用的很简单,就是调用之前写的函数,然后渲染模板展示html在本地
# 世界地图和表格
@app.route('/')
def map_world():url = 'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist'world_map(url)return render_template('各国数据(%s).html'%(datetime.date.today()))@app.route('/index')
def index():return redirect(map_world)#多国累计确诊趋势折线图
@app.route('/manycounrtry')
def manyCountry():main()return render_template('多国累计确诊趋势折线图.html')wn = World_ncov()##各大洲柱状图
@app.route('/world/statis')
def worldStatis():wn.continentStatis()return render_template('各大洲柱状图.html')#今日新增 countryAddConfirmRankList 国家
@app.route('/counrtryadd')
def worldCountryAdd():wn.countryAddConfirmRankList()return render_template('今日国家新增数量.html')#中国省份现有全确诊人数
@app.route('/china')
def chinaMap():wn.china_map()return render_template('中国省份现有全确诊人数.html')"""
全球除了中国的
如果要实现总的确诊人数把 name = 'confirm'
全球每日死亡折线图name = 'dead'
全球每日治愈折线图name = 'heal'
全球每日治愈折线图name = 'newAddConfirm'"""
#http://127.0.0.1:5000/world/info/heal/
#这种格式
@app.route('/world/info//' )
def worldInfo(name):print(name)wn.globalDailyHistory(name=name)return render_template('全球历史%s信息.html'%name)if __name__ == '__main__':app.run()
lima
差不多了,第一次那么写那么多。不写了。下次在写。过几天写一个python爬虫
源代码放在了百度网盘需要的可自行下载,里面一些函数命名,真头痛,不知你们是否遇到过,起名字的困难。哎
提取码:sj8y
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
