干货|Python+Pyecharts (1.6.2 最新版)制作全国各主要城市冠状病毒分布图

此次病毒肆虐,相信大家都见过这张图:
干货|Python+Pyecharts (1.6.2 最新版)制作全国各主要城市冠状病毒分布图_第1张图片
这张图的优点是直观,缺点是“太直观”,太粗略了,不能看出各城市的详细情况,于是我萌发了制作一个更“详细”专题地图的想法!好了现在直奔主题:学习+操作!

一、 安装Pyecharts

  简单的说, Pyecharts是一款将python与echarts结合的强大的数据可视化工具。

1.安装

打开终端,使用pip命令:

pip install   Pyecharts

链接的是国外网,如果嫌慢,可镜像清华的路径,具体命令如下:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple  Pyecharts

安装别的也可以用这个命令,只要把“Pyecharts”换掉。
要注意的是,现在这样安装的版本是1.6.2,和之前的比还是差别比较大的,目前你能百度到的都是以前版本的代码,如果参考以前的学习,会问题很多的。自己感觉python的包各版本变化其实是很大的,感觉很随意,这一点很不友好。

2.安装对应的地图扩展包

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爬虫很牛逼,什么都能爬,何况这。
干货|Python+Pyecharts (1.6.2 最新版)制作全国各主要城市冠状病毒分布图_第2张图片
爬下来还不行,关键是要爬到画图需要的数据格式,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)#打印出来检查下,这一步最重要

二、调用Geo类和Map类

这一步,踩了很多坑,主要是因为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')

最开心的时刻来了,结果如下:
干货|Python+Pyecharts (1.6.2 最新版)制作全国各主要城市冠状病毒分布图_第3张图片
现在讲一下天天见的那个图怎么做的,同样定义一个函数:

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()“换成各省的数据列表就行,格式和上面一样。感兴趣自己小伙伴自己去试一试吧!

你可能感兴趣的:(笔记)