大体思路:
通过pyecharts等库+一个for循环批量绘制近几个月每天的图,最后通过pr将图片合成
先看一下某一天的样图,用pr组合起来之后就是个动态的了
首先先安装pyecharts库,cmd中输入
pip install pyecharts
自从pyecharts版本升级后,pyecharts 将不再自带地图 js 文件,所以需要自行下载地图图标,按照自己的需求下载不同的地图
pip install echarts-countries-pypkg
pip install echarts-china-provinces-pypkg
pip install echarts-china-cities-pypkg
pip install echarts-china-counties-pypkg
pip install echarts-china-misc-pypkg
pip install echarts-united-kingdom-pypkg
安装好之后就可以来进行制图了
这里提供一个对照的中文功能手册,很详细
http://pyecharts.org/#/zh-cn/intro
这里我就不直接给出数据了,要通过自己劳动所得。
提供一个up主的视频,很好的资源:
https://www.bilibili.com/video/BV1WE411K7jB?t=26
得到一个这样子的excel的表格后,会拥有到当天为止所有城市的所有数据,但是,在一个excel表格当中,他不好提去数据啊来导入啊,所以我们按照日期来将其拆分为n哥.xlsx文件
这里用一个叫方方格子的辅助工具
下面是我们所用到的所有库
包括pandas、pyecharts、os、snapshot库
主要作用
pandas库用来处理导入的文件
pyecharts用来作图
os库来找出当前路径下所有的.xlsx文件
snapshot库用来将导出的文件转化为.png格式
import pandas as pd
from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
from pyecharts.charts import Map
from pyecharts import options as opts
from snapshot_pyppeteer import snapshot
from pyecharts.render import make_snapshot
import os
这里之前没有接触过pandas库,感觉pandas库应该有操作可以代替os库的操作,这里可以自行查一下
start = time.perf_counter()
items = os.listdir(".")
newlist = []
for names in items:
if names.endswith(".xlsx"):
newlist.append(names)
首先通过pandas库将导入数据转换成列表类型
通过for循环对列表进行操作,求得 live 治愈人数 dies 死亡人数 alls 全国总共确诊人数等数据,对后面过程有用
df = pd.read_excel(url)
df_1 = df['省份'].tolist()
df_2 = df['累计确诊'].tolist()
df_3 = df['死亡'].tolist()
df_4 = df['治愈'].tolist()
remain=[]
ans,live,die,alls=0,0,0,0
len1=len(df_2)
flag=0
for i in range(len1):
x=df_2[i]-df_3[i]-df_4[i];
if(df_1[i]=='海南'):
df_1.append('南海诸岛')
flag=x
remain.append(x)
ans+=x
live+=df_4[i]
die+=df_3[i]
alls+=df_2[i]
if(flag!=0):
remain.append(flag)
这两句是把每个省现存确诊人数由大到小进行排序,生成一个排名的二维列表,从而对后面操作有用
zipped = dict(zip(df_1,remain))
sorted_zip=sorted(zipped.items(),key=lambda x:x[1],reverse=True)
设置函数
nations 国家列表
values 各省现存确诊人数列表
sum 全国现存确诊人数
date 当天日期
rating排名二维列表
live 治愈人数
dies 死亡人数
alls 全国总共确诊人数
def map_visualmap(nations, values,sum,date,rating,live,dies,alls):
这里给的是图片格式,拒绝抄袭(实在不想写那你可以私聊我),再说一遍所有的操作函数都在这个使用手册中,如果看不懂使用手册,那就现去学类和继承,或者对应着图片的操作能做出来图片中的所有操作,在手册中都是可以找得到的
在将某些数据放在图上的时候,因为你具体不知道那个点的坐标,所以你可能需要多次来进行微调才能把你想要放的东西放置到目标位置。
主要思路:
1.左上角使用标题与副标题+传过来的(利用字符串可以直接拼接的特性) sum 全国现存确诊人数 date 当天日期 live 治愈人数 dies 死亡人数 alls 全国总共确诊人数这几个参数组合而成
2.中间的地图是通过.add操作将nations 国家列表和 values 各省现存确诊人数列表插入到地图当中去的
3.右下角是通过GraphicGroup:原生图形元素组件+排好序的二维列表来实现的(利用字符串可以直接拼接的特性)
4.中间的地图是通过.add操作将nations 国家列表和 values 各省现存确诊人数列表插入到地图当中去的
1.前三点是通过set_global_opts进行设置从而使用的:
里面对应手册都会有等等不同的操作,这里列举一个操作内容
title_opts //左上角的内容
graphic_opts //右下角的内容
visualmap_opts //左下角的分色
看下面的操作,
标题内容 title=""
标题距离左边距和右边距的距离pos_left=20,pos_top=10
标题的格式 title_textstyle_opts
副标题内容subtitle=""
副标题距离标题的距离item_gap=
副标题样式 subtitle_textstyle_opts=
title_opts=opts.TitleOpts(title="COVID-19现存确诊人数变化专题地图",pos_left=20,pos_top=10,title_textstyle_opts=opts.TextStyleOpts(color='#FF4500',font_size=25),
subtitle=date[0]+"月"+date[1:3]+"日全国:\n\n累计确诊人数:"+str(alls)+"\n\n"+"现存确诊人数: "+str(sum)+"\n\n"+"治愈人数: "+str(live)+"\n\n"+"死亡人数: "+str(dies),
item_gap=20,subtitle_textstyle_opts=opts.TextStyleOpts(color='#FF8C00',font_size=18)),
2.如何将数据添加到地图上呢?
主要是通过他的.add操作
.add("", [list(z) for z in zip(nations, values)], "china",is_map_symbol_show=False)
3.其他设置
这里这个map()类是要导入进来的,如果你不需要设置背景颜色,只需要这样写Map(),把里面的内容去掉即可
Map(init_opts=opts.InitOpts(bg_color='#F0F0F0'))
http://pyecharts.org/#/zh-cn/intro
http://pyecharts.org/#/zh-cn/intro
http://pyecharts.org/#/zh-cn/intro
这一主要运用了
from snapshot_pyppeteer import snapshot
from pyecharts.render import make_snapshot
make_snapshot(snapshot,c.render(),url[-8:-5]+'.png')
这里不上传函数里面得代码了就。
items = os.listdir(".")
newlist = []
for names in items:
if names.endswith(".xlsx"):
newlist.append(names)
for url in newlist:
df = pd.read_excel(url)
df_1 = df['省份'].tolist()
df_2 = df['累计确诊'].tolist()
df_3 = df['死亡'].tolist()
df_4 = df['治愈'].tolist()
remain=[]
ans,live,die,alls=0,0,0,0
len1=len(df_2)
flag=0
for i in range(len1):
x=df_2[i]-df_3[i]-df_4[i];
if(df_1[i]=='海南'):
df_1.append('南海诸岛')
flag=x
remain.append(x)
ans+=x
live+=df_4[i]
die+=df_3[i]
alls+=df_2[i]
if(flag!=0):
remain.append(flag)
#从大到小进行排序
zipped = dict(zip(df_1,remain))
sorted_zip=sorted(zipped.items(),key=lambda x:x[1],reverse=True)
print(cnt)
cnt+=1
# 实例化地图函数
c = map_visualmap(nations=df_1, values=remain,sum=ans,rating=sorted_zip,date=url[-8:-5],live=live,dies=die,alls=alls)
make_snapshot(snapshot,c.render(),url[-8:-5]+'.png')
#c.render(path=r'C:\Users\Xiaoxiaoxiao\Desktop\地图\网页结果'+url[-8:-5]+".html")
经过上述得步骤之后,你就可以点即运行按钮,坐等收生成(大约需要十几分钟)这一百多实时数据更新得地图了,然后通过pr简单得图片合成即可得道一个很好的实时更新视频了。
重点是学习如何应用pyecharts库,也就是说,你需要看懂那个中文使用手册,只要看懂他,并且知道如何调用里面的函数,这个库可能就没有什么地方可以难得倒你了吧。
菜鸡一枚,dalao勿喷,有问题一起交流