此次病毒肆虐,相信大家都见过这张图:
这张图的优点是直观,缺点是“太直观”,太粗略了,不能看出各城市的详细情况,于是我萌发了制作一个更“详细”专题地图的想法!好了现在直奔主题:学习+操作!
简单的说, Pyecharts是一款将python与echarts结合的强大的数据可视化工具。
打开终端,使用pip命令:
pip install Pyecharts
链接的是国外网,如果嫌慢,可镜像清华的路径,具体命令如下:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple Pyecharts
安装别的也可以用这个命令,只要把“Pyecharts”换掉。
要注意的是,现在这样安装的版本是1.6.2,和之前的比还是差别比较大的,目前你能百度到的都是以前版本的代码,如果参考以前的学习,会问题很多的。自己感觉python的包各版本变化其实是很大的,感觉很随意,这一点很不友好。
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,最好用清华镜像,会快许多。
画图就要有数据,数据不能手动写,所以要爬虫,爬虫前期有些大神已经做好,可以参考使用。Python爬虫很牛逼,什么都能爬,何况这。
爬下来还不行,关键是要爬到画图需要的数据格式,Pyecharts需要的是一个有元祖组成的列表,格式是这样的:
data=[('苏州', 55), ('南京', 47), ('徐州', 45), ('无锡', 26), ('泰州', 26), ('淮安', 26), ('南通', 25), ('常州', 24), ('连云港', 20), ('扬州', 15), ('盐城', 15), ('宿迁', 11), ('镇江', 6), ('青岛', 35), ('临沂', 30)....]
数据如果少,你也可以自己写,简单暴力!这个比较多,所以需要遍历,代码如下:
import pandas as pd
Result=pd.DataFrame()#定义两个pandas数据框,储存数据
Result1=pd.DataFrame()
for f_name in lst:
if f_name[-3:]=="csv":
data = pd.read_csv(f_name)
data_City=data["城市"]#找到对应的列
data_Numbers=data["确诊人数"]
Result1=pd.concat([data_City,data_Numbers], axis=1)#存数据
Result = pd.concat([Result, Result1])#再把数据收集在一起
这还不够,因为要组成元祖组成的列表,所以再做如下动作:
data=[]#定义一个数据集
for i in range(len(Result)):
turple=(Result.iat[i,0],int(Result.iat[i,1]))
data.append(turple)
print(data)#打印出来检查下,这一步最重要
这一步,踩了很多坑,主要是因为Pyecharts的版本问题,初期使用from pyecharts import Geo,Map,怎么都导不进去,报错!其实,原因是新版本把Geo,Map的路径换了,网上现在你能搜到的都是原来的版本,改成from pyecharts.charts import Geo,Map就好了!
下面将调用Geo和Map类创建实例,这里讲官方用的方法:
def geo_virus() -> Geo:#定义一个继承Geo的新函数!
c = (
Geo(init_opts=opts.InitOpts(theme=ThemeType.DARK))#选择主题
.add_schema(maptype="china")#添加中国
.add("",data,ChartType.EFFECT_SCATTER,#选择地图类型
is_selected = True,symbol = None,symbol_size= 6,color="red")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(visualmap_opts=opts.VisualMapOpts(is_piecewise=True,max_=1000,),#设1000为最大阈值
title_opts=opts.TitleOpts(title="全国各城市新型冠状病毒感染分布图", pos_left="300")#标题名和位置,还有几个参数,自己试
)
)
return c
第一行里**-> **很多人看不懂,其实就是先继承Geo,可以少写代码。
最后调用函数,生成.html,完整代码如下:
import os
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Geo,Map
from pyecharts.globals import ChartType, SymbolType
from pyecharts.globals import ThemeType
Result=pd.DataFrame()
Result1=pd.DataFrame()
lst=os.listdir()
for f_name in lst:
if f_name[-3:]=="csv":
data = pd.read_csv(f_name)
data_City=data["城市"]
data_Numbers=data["确诊人数"]
Result1=pd.concat([data_City,data_Numbers], axis=1)
Result = pd.concat([Result, Result1])
data=[]#定义一个数据集
for i in range(len(Result)):
turple=(Result.iat[i,0],int(Result.iat[i,1]))
data.append(turple)
print(data)
def geo_virus() -> Geo:
c = (
Geo(init_opts=opts.InitOpts(theme=ThemeType.DARK))
.add_schema(maptype="china")
.add("",data,ChartType.EFFECT_SCATTER,#选择地图类型
is_selected = True,symbol = None,symbol_size= 6,color="red")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(visualmap_opts=opts.VisualMapOpts(is_piecewise=True,max_=1000,),
title_opts=opts.TitleOpts(title="全国各城市新型冠状病毒感染分布图",
pos_left="300")
)
)
return c
g=geo_virus()#调用一下这个定义的函数
g.render('全国新型冠状病毒感染分布图.html')
最开心的时刻来了,结果如下:
现在讲一下天天见的那个图怎么做的,同样定义一个函数:
def map_virus() -> Map:
c = (
Map()
.add("", [list(z) for z in zip(Faker.provinces, Faker.values())], "china")
.set_global_opts(
title_opts=opts.TitleOpts(title="全国各省新型冠状病毒感染分布图"),
visualmap_opts=opts.VisualMapOpts(max_=100),
)
)
return c
g=map_virus()
把”list(z) for z in zip(Faker.provinces, Faker.values()“换成各省的数据列表就行,格式和上面一样。感兴趣自己小伙伴自己去试一试吧!