Python + PyEcharts 爬取丁香医生 自动绘制全国所有省份地图

在这里插入图片描述这是我第一次写爬虫,虽然学过Python,但也仅限于蜻蜓点水,做出这么大工程量的东西,确实有点超出我的经验和心理预期了。但是,人总是得突破舒适圈,做出一点东西,才能真正地实现创造的快乐。本次编写过程,几乎是从零开始,一行一行地想办法,用了一周的时间,写了500行代码,才最终实现了我想要的效果。但是实际上,一共写的代码量是这的三倍,只不过因为不是特别了解,一直在尝试各种方法,最终能成的方法也只占三成,所以走了不少弯路。那么下面,我就给大家介绍一下我的具体编写过程,以及我踩过的坑,还有我自己的解决办法。
以下所有代码皆按照顺序逐一介绍,因为编写过程中没按照封装函数的方式去写,所以大家把它们连在一起,就是我的代码最终的样子。经验不足,代码略微繁琐,请见谅。
代码分为四个部分:

  1. 抓取数据
  2. 将数据存入数据库
  3. 把数据处理成地图所需要的规范化格式
  4. 画图

第一部分,抓取数据。
首先,介绍一下我所用到的所有模块。

import requests
import json
import pymysql
import xlwt as ExcelWrite
from xlwt import XFStyle, Pattern
import datetime
import time
from pyecharts import options as opts
from pyecharts.charts import Geo, Bar, Map
from pyecharts.render import make_snapshot
from tkinter import *
from snapshot_phantomjs import snapshot
import tkinter as tk

注意,里面有一个snapshot,它的作用是把PyEcharts生成的图片解析成PNG格式,需要安装一些东西,大家在本网站自行搜索“PyEcharts如何生成图片"即可。

接着,先把数据库建好表。我是直接在Navicat里建的。
城市表,存储丁香医生爬到的所有城市的各种数据。
在这里插入图片描述
省份表,存储的是所有省份的各项数据。
在这里插入图片描述
国家表,记录全国所有确诊、治愈、死亡的总人数。
在这里插入图片描述
新闻表,存储爬到的实时新闻,这个按需创建,对我们画图没有影响。
在这里插入图片描述
日志表,记录我们爬虫的日志,比如爬了多长时间,爬到了多少数据。
在这里插入图片描述
建完表之后,我一开始就选择清空表的内容,很奇怪是吧,没有数据呢还,为啥还要清,因为后续爬虫的数据会一次一次地存入到数据库,为了怕挤爆,每次爬之前都要清一下。

db = pymysql.connect(host="localhost", user="你的用户名", passwd="你的密码", db="demo1", charset='utf8')
cursor = db.cursor()
sql_clear_citydata = 'truncate citydata'
cursor.execute(sql_clear_citydata)
sql_clear_provincedata = 'truncate provincedata'
cursor.execute(sql_clear_provincedata)
sql_clear_timeline = 'truncate timeline'
cursor.execute(sql_clear_timeline)

清完城市表、省份表、新闻表,我们就可以去爬虫了。

start_date = datetime.datetime.now()
start_second = time.time()

这两句的作用是记录爬虫开始的时间。

url = "https://ncov.dxy.cn/ncovh5/view/pneumonia"
r = requests.get(url, timeout=20)
r.raise_for_status()
r.encoding = r.apparent_encoding
html = r.text
string_data = re.findall(r'window.getAreaStat = (.*?)}catch', html)[0]
province_combine = json.loads(string_data, encoding='utf-8')
string_timeline = re.findall(r'window.getTimelineService = (.*?)}catch', html)[0]
all_news_combine = json.loads(string_timeline, encoding='utf-8')

这几行代码是抓取丁香医生网页的数据,他的初始数据是一大片字符串。
打开Firefox浏览器,查看丁香医生网页的源代码你就会看到这些:
在这里插入图片描述
我们爬取的目标就是这些,因为是字符串,所以很简单,用正则表达式,上面那几行代码就可以实现。

end_second = time.time()
end_date = datetime.datetime.now()
time_total = end_second - start_second

这几句记录了爬虫的结束时间,以及一共用了多久。

pdata_flag = 0
cdata_flag = 0
pname_list = []
pconfirmed_list = []
pcured_list = []
pdead_list = []
pid_list = []
cname_list = []
cconfirmed_list = []
ccured_list = []
cdead_list = []
cid_list = []
pconfirmed_geo = []
cconfirmed_geo = []
test_name = input("请输入省份:")
for i in range(len(province_combine)):
    pdata_flag = pdata_flag+1
    province_single = province_combine[i]
    province_name = province_single['provinceShortName']
    if province_name == test_name:
        heilongjiang = province_combine[i]
    province_confirmed_count = province_single['confirmedCount']
    province_cured_count = province_single['curedCount']
    province_dead_count = province_single['deadCount']
    province_ID = province_single['locationId']
    pname_list.append(province_name)
    pconfirmed_list.append(province_confirmed_count)
    pcured_list.append(province_cured_count)
    pdead_list.append(province_dead_count)
    pid_list.append(province_ID)
    city_combine = province_single['cities']
    sql_add_into_provincedata = 'insert into %s(pname, pconfirmed, pcured, pdead, pid)' % 'provincedata' + 'value(%s,%s,%s,%s,%s)'
    cursor.execute(sql_add_into_provincedata,
                   [province_name, province_confirmed_count, province_cured_count, province_dead_count, province_ID])
    db.commit()
    for j in range(len(city_combine)):
        cdata_flag = cdata_flag + 1
        city_single = city_combine[j]
        city_name = city_single['cityName']
        city_confirmed_count = city_single['confirmedCount']
        city_cured_count = city_single['curedCount']
        city_dead_count = city_single['deadCount']
        city_ID = city_single['locationId']
        cname_list.append(city_name)
        cconfirmed_list.append(city_confirmed_count)
        ccured_list.append(city_cured_count)
        cdead_list.append(city_dead_count)
        cid_list.append(city_ID)
        sql_add_into_citydata = 'insert into %s(cname, cconfirmed, ccured, cdead, cid)' % 'citydata' +'value(%s,%s,%s,%s,%s)'
        cursor.execute(sql_add_into_citydata, [city_name, city_confirmed_count, city_cured_count, city_dead_count, city_ID])
        sql_add_into_citybelong = 'insert into %s(cityname, provincename)' % 'citybelong'+'value(%s,%s)'
        cursor.execute(sql_add_into_citybelong, [city_name, province_name])
        db.commit()
n_confirmed_data = 0
n_cured_data = 0
n_dead_data = 0
for i in range(len(pconfirmed_list)):
    n_confirmed_data = n_confirmed_data+pconfirmed_list[i]
for i in range(len(pcured_list)):
    n_cured_data = n_cured_data+pcured_list[i]
for i in range(len(pdead_list)):
    n_dead_data = n_dead_data+pdead_list[i]
sql_add_into_nationdata = 'insert into %s(nconfirmed, ncured, ndead)' % 'nationdata'+'value(%s,%s,%s)'
cursor.execute(sql_add_into_nationdata, [n_confirmed_data, n_cured_data, n_dead_data])
db.commit()

各种操作看着眼花缭乱,其实就是把数据都存入到相应的数据库的表中,然后生成各项数据的列表。我为啥要一个数据类型建一个列表呢,因为画图需要,最后你就知道了。当然,这里面有很多东西我可能写得多余。

news_flag = 0
news_time_list = []
news_title_list = []
file = open("news.txt", 'w')
for a in range(len(all_news_combine)):
    news_flag = news_flag+1
    province_news_combine = all_news_combine[a]
    news_time = province_news_combine['pubDateStr']
    news_title = province_news_combine['title']
    news_content = province_news_combine['summary']
    news_time_list.append(news_time)
    news_title_list.append(news_title)
    sql_add_into_timeline = 'insert into %s(ntime , ntitle, ncontent)' % 'timeline' + 'value(%s,%s,%s)'
    cursor.execute(sql_add_into_timeline, [news_time, news_title, news_content])
    db.commit()
    file.write(str(news_time))
    file.write(' ')
    file.write(str(news_title))
    file.write('\n')
file.close()

把新闻写入到数据库和txt中。

total_data = (pdata_flag+cdata_flag)*5+news_flag
sql_log = 'insert into %s(totaltime, totaldata, pflag, cflag)' % 'log' + 'value(%s,%s,%s,%s)'
cursor.execute(sql_log, [time_total, total_data, pdata_flag, cdata_flag])
db.commit()
xls = ExcelWrite.Workbook()
sheet1 = xls.add_sheet("Sheet1")
style1 = XFStyle()
pattern = Pattern()
pattern.pattern = Pattern.SOLID_PATTERN
pattern.pattern_fore_colour = 0x16
style1.pattern = pattern
province_data_list = ['省份', '确诊', '治愈', '死亡', 'ID']
for i in range(len(province_data_list)):
    sheet1.write(0, i, province_data_list[i], style1)
    sheet1.col(i).width = 5240
sheet2 = xls.add_sheet("Sheet2")
style2 = XFStyle()
pattern = Pattern()
pattern.pattern = Pattern.SOLID_PATTERN
pattern.pattern_fore_colour = 0x16
style2.pattern = pattern
city_data_list = ['城市', '确诊', '治愈', '死亡', 'ID']
for i in range(len(city_data_list)):
    sheet2.write(0, i, city_data_list[i], style2)
    sheet2.col(i).width = 5240
sql_select_province_data = 'select * from provincedata'
cursor.execute(sql_select_province_data)
pdatabase_all_data = cursor.fetchall()
db.commit()

row = 0
for i in range(len(pdatabase_all_data)):
    pdata_single_info = pdatabase_all_data[i]
    row = row+1
    for a in range(len(pdata_single_info)):
        sheet1.write(row, a, pdata_single_info[a])
sql_select_city_data = 'select * from citydata'
cursor.execute(sql_select_city_data)
cdatabase_all_data = cursor.fetchall()
db.commit()
row = 0
for i in range(len(cdatabase_all_data)):
    cdata_single_info = cdatabase_all_data[i]
    row = row+1
    for j in range(len(cdata_single_info)):
        sheet2.write(row, j, cdata_single_info[j])
xls.save('全国病毒感染情况.xls')

把数据写到Excel里,这个其实很有用,当你有了表格后,查看数据很方便,你不用去数据库里看,那样太费事。

扫描二维码关注公众号,回复: 9108037 查看本文章
log_txt = open('log.txt', mode='a', encoding='utf-8')
print("******************************爬虫日志******************************", file=log_txt)
print(start_date, "开始爬虫", file=log_txt)
print("自动抓取数据成功,已存储至数据库中,爬虫过程用时", '%.2f' % time_total, '秒', file=log_txt)
print("共获得了", pdata_flag, "个省级行政区、", cdata_flag, "个市级单位总计", (total_data), "个疫情数据", file=log_txt)
print(end_date, "结束爬虫", file=log_txt)
log_txt.close()

将爬虫日志写入到txt中。

for i in range(len(cid_list)):
    if -1 in cid_list:
        p = cid_list.index(-1)
        cid_list.pop(p)
        cname_list.pop(p)
        cconfirmed_list.pop(p)
for i in range(len(cid_list)):
    if 0 in cid_list:
        p = cid_list.index(0)
        cid_list.pop(p)
        cname_list.pop(p)
        cconfirmed_list.pop(p)
for i in range(len(cname_list)):
    if '德宏' in cname_list:
        p = cname_list.index('德宏')
        cid_list.pop(p)
        cname_list.pop(p)
        cconfirmed_list.pop(p)
for i in range(len(cname_list)):
    if '普洱' in cname_list:
        p = cname_list.index('普洱')
        cid_list.pop(p)
        cname_list.pop(p)
        cconfirmed_list.pop(p)
for i in range(len(cname_list)):
    if '陵水' in cname_list:
        p = cname_list.index('陵水')
        cid_list.pop(p)
        cname_list.pop(p)
        cconfirmed_list.pop(p)
for i in range(len(cname_list)):
    if '乐东' in cname_list:
        p = cname_list.index('乐东')
        cid_list.pop(p)
        cname_list.pop(p)
        cconfirmed_list.pop(p)
for i in range(len(cname_list)):
    if '琼中' in cname_list:
        p = cname_list.index('琼中')
        cid_list.pop(p)
        cname_list.pop(p)
        cconfirmed_list.pop(p)
for i in range(len(cname_list)):
    if '黔南州' in cname_list:
        p = cname_list.index('黔南州')
        cid_list.pop(p)
        cname_list.pop(p)
        cconfirmed_list.pop(p)
for i in range(len(cname_list)):
    if '黔东南州' in cname_list:
        p = cname_list.index('黔东南州')
        cid_list.pop(p)
        cname_list.pop(p)
        cconfirmed_list.pop(p)
for i in range(len(cname_list)):
    if '黔西南州' in cname_list:
        p = cname_list.index('黔西南州')
        cid_list.pop(p)
        cname_list.pop(p)
        cconfirmed_list.pop(p)
for i in range(len(cname_list)):
    if '延边' in cname_list:
        p = cname_list.index('延边')
        cid_list.pop(p)
        cname_list.pop(p)
        cconfirmed_list.pop(p)
for i in range(len(cname_list)):
    if '伊犁州' in cname_list:
        p = cname_list.index('伊犁州')
        cid_list.pop(p)
        cname_list.pop(p)
        cconfirmed_list.pop(p)

这段操作可能大家看得很迷惑,这是干啥啊,还是为了画图。Pyecharts的地图,需要你的城市名字是规范化的,比如,延边,这就不行,Pyecharts不认,你得把他写成延边朝鲜族自治州。当然为了省事我就直接把这个城市的数据暂时删掉。-1和0是城市的ID,正常城市的ID是455644这种,但丁香医生的数据里,有”待明确地区“,这根本就不是个地方,它的ID是-1,地图肯定不认,所以直接删掉。

pconfirmed_geo = list(zip(pname_list, pconfirmed_list))
cconfirmed_geo = list(zip(cname_list, cconfirmed_list))
hei_city_combine = heilongjiang['cities']
hei_city_name_list = []
hei_city_confirmed_list = []
hei_id_list = []
for i in range(len(hei_city_combine)):
    hei_city_sigle = hei_city_combine[i]
    hei_city_name = hei_city_sigle['cityName']
    hei_city_confirmed = hei_city_sigle['confirmedCount']
    hei_id = hei_city_sigle['locationId']
    hei_id_list.append(hei_id)
    hei_city_name_list.append(hei_city_name)
    hei_city_confirmed_list.append(hei_city_confirmed)

这一步是把画地图所需要的数据整理好,hei_city就是到时候你自己输入的省份所对应的各个城市的名字。但是,不出你所料,这些城市里,很多名字是不规范化的,但是这个就不能删了。全国地区你删一个两个那无关紧要,因为它显示的是整个省的宏观数据,丁香医生这里,省份数据又是和各个城市的数据是分开的,所以你删城市数据没啥事。但是,我们还要画各个省的地图呢,到时就会显示每一个城市的信息,你删掉一个城市真个图就不对了。所以,我们得把这些名字都规范化。

if test_name == '北京':
    hei_end_name_list = hei_city_name_list
if test_name == '上海':
    hei_end_name_list = hei_city_name_list
if test_name == '天津':
    hei_end_name_list = hei_city_name_list
if test_name == '重庆':
    hei_end_name_list = ['梁平县' if i == '梁平区' else '武隆县' if i == '武隆区' else '彭水苗族土家族自治县' if i == '彭水县' else '秀山土家族苗族自治县' if i == '秀山县' else '酉阳土家族苗族自治县' if i == '酉阳县' else '石柱土家族自治县' if i == '石柱县' else str(i)  for i in hei_city_name_list]
if test_name == '海南':
    hei_end_name_list = ['昌江黎族自治县' if i == '昌江' else '定安县' if i == '定安' else'昌江黎族自治县' if i == '昌江' else '临高县' if i == '临高' else'澄迈县' if i == '澄迈' else '保亭黎族苗族自治县' if i == '保亭' else '陵水黎族自治县' if i == '陵水' else '琼中黎族苗族自治县' if i == '琼中' else '乐东黎族自治县' if i == '乐东'else str(i)+"市" for i in hei_city_name_list]
if test_name == '黑龙江':
    hei_end_name_list = ['大兴安岭地区' if i == '大兴安岭' else str(i)+"市" for i in hei_city_name_list]
if test_name == '辽宁':
    hei_end_name_list = [str(i)+"市" for i in hei_city_name_list]
if test_name == '河北':
    hei_end_name_list = [str(i)+"市" for i in hei_city_name_list]
if test_name == '河南':
    hei_end_name_list = [str(i)+"市" for i in hei_city_name_list]
if test_name == '吉林':
    hei_end_name_list = ['延边朝鲜族自治州' if i == '延边' else '四平市' if i == '四平市' else '吉林市' if i== '吉林市' else str(i)+"市" for i in hei_city_name_list]
if test_name == '内蒙古':
    hei_end_name_list = ['兴安盟' if i == '兴安盟' else '锡林郭勒盟' if i == '锡林郭勒盟' else str(i)+"市" for i in hei_city_name_list]
if test_name == '新疆':
    hei_end_name_list = ['五家渠市' if i == '兵团第六师五家渠市' else '石河子市' if i == '兵团第八师石河子市' else '昌吉回族自治州' if i == '昌吉州' else '塔城地区' if i == '塔城地区' else '巴音郭楞蒙古自治州' if i == '巴州' else '伊犁哈萨克自治州' if i == '伊犁州' else '吐鲁番市' if i == '吐鲁番市' else '阿克苏地区' if i == '阿克苏地区' else str(i)+"市" for i in hei_city_name_list]
if test_name == '西藏':
    hei_end_name_list = [str(i) + "市" for i in hei_city_name_list]
if test_name == '青海':
    hei_end_name_list = ['海北藏族自治州' if i == '海北州' else str(i) + "市" for i in hei_city_name_list]
if test_name == '山东':
    hei_end_name_list = [str(i) + "市" for i in hei_city_name_list]
if test_name == '山西':
    hei_end_name_list = [str(i) + "市" for i in hei_city_name_list]
if test_name == '陕西':
    hei_end_name_list = [str(i) + "市" for i in hei_city_name_list]
if test_name == '甘肃':
    hei_end_name_list = [str(i) + "市" for i in hei_city_name_list]
if test_name == '湖北':
    hei_end_name_list = ['恩施土家族苗族自治州' if i == '恩施州' else'神农架林区' if i == '神农架林区' else str(i) + "市" for i in hei_city_name_list]
if test_name == '湖南':
    hei_end_name_list = ['湘西土家族苗族自治州' if i == '湘西自治州' else str(i) + "市" for i in hei_city_name_list]
if test_name == '云南':
    hei_end_name_list = [ '红河哈尼族彝族自治州' if i == '红河州' else '西双版纳傣族自治州' if i == '西双版纳' else '德宏傣族景颇族自治州' if i == '德宏州' else '大理白族自治州' if i == '大理州' else '楚雄彝族自治州' if i == '楚雄州' else '文山壮族苗族自治州' if i == '文山州'  else str(i) + "市" for i in hei_city_name_list]
if test_name == '贵州':
    hei_end_name_list = ['黔东南苗族侗族自治州' if i == '黔东南州' else '黔南布依族苗族自治州' if i == '黔南州' else '黔西南布依族苗族自治州' if i == '黔西南州' else str(i) + "市" for i in hei_city_name_list]
if test_name == '四川':
    hei_end_name_list = ['甘孜藏族自治州' if i == '甘孜州' else '凉山彝族自治州' if i == '凉山州' else '阿坝藏族羌族自治州' if i == '阿坝州' else str(i) + "市" for i in hei_city_name_list]
if test_name == '福建':
    hei_end_name_list = [str(i) + "市" for i in hei_city_name_list]
if test_name == '江苏':
    hei_end_name_list = [str(i) + "市" for i in hei_city_name_list]
if test_name == '江西':
    hei_end_name_list = [str(i) + "市" for i in hei_city_name_list]
if test_name == '安徽':
    hei_end_name_list = [str(i) + "市" for i in hei_city_name_list]
if test_name == '广东':
    hei_end_name_list = [str(i) + "市" for i in hei_city_name_list]
if test_name == '广西':
    hei_end_name_list = [str(i) + "市" for i in hei_city_name_list]
if test_name == '浙江':
    hei_end_name_list = [str(i) + "市" for i in hei_city_name_list]
if test_name == '宁夏':
    hei_end_name_list = [str(i) + "市" for i in hei_city_name_list]

把每一个城市的名字都给规范化了,这样地图就认识了,他就会接受你,不然有一个名字是错的,他都报错不给你画。比如这样:
在这里插入图片描述
在这里插入图片描述
因为有个”待明确地区“,他罢工了。

hei_all = 0
for i in range(len(hei_city_confirmed_list)):
    hei_all = hei_all+ hei_city_confirmed_list[i]
    print(hei_end_name_list[i], "确诊人数为", hei_city_confirmed_list[i])
print("_________________________")
print(str(test_name)+"省确诊总人数为",hei_all)
print("**************************爬虫日志**************************")
print(start_date, "开始爬虫")
print("自动抓取数据成功,已存储至数据库中,整个过程用时", '%.2f' % time_total, '秒')
print("共获得了", pdata_flag, "个省级行政区、", cdata_flag, "个市级单位总计", (total_data), "个疫情数据")
print(end_date, "结束爬虫")
print("********************图片已自动生成至文件夹中******************")

这几句是你输入完所要查找的省份后,后台输出数据所用到的语句,以及爬虫日志。

for i in range(len(hei_id_list)):
    if -1 in hei_id_list:
        p = hei_id_list.index(-1)
        hei_id_list.pop(p)
        hei_end_name_list.pop(p)
        hei_city_confirmed_list.pop(p)
for i in range(len(hei_id_list)):
    if 0 in hei_id_list:
        p = hei_id_list.index(0)
        hei_id_list.pop(p)
        hei_end_name_list.pop(p)
        hei_city_confirmed_list.pop(p)
hei_geo = [[hei_end_name_list[i], hei_city_confirmed_list[i]] for i in range(len(hei_end_name_list))]

把城市ID错误的删掉,并得出我们最后要画的图所需要的列表。

now_data_time = time.strftime('%m-%d %H', time.localtime())
end_data_time = str('截至 ')+now_data_time+str('时')

这两句是记录当前时间,这样你画图的时候,标题就可以直接用它,说,XXX省地图的数据是截至什么什么时候的。

bar1 = (
    Geo()
    .add_schema(maptype = test_name, itemstyle_opts=opts.ItemStyleOpts(color='#404a59'))
    .add("数据"+str(end_data_time), hei_geo, label_opts=opts.LabelOpts(is_show=True, formatter="{b}{c}"))
    .set_series_opts(label_opts=opts.LabelOpts(is_show=True, formatter="{b}{c}"), type='heatmap')
    .set_global_opts(
        visualmap_opts=opts.VisualMapOpts(max_=5, is_piecewise=False),
        title_opts=opts.TitleOpts(title=str(test_name)+"新型冠状病毒疫情热力图")
)
    )
make_snapshot(snapshot, bar1.render(), str(test_name)+"热力图.png")
bar1.render(str(test_name)+"热力图.html")

给你们看看效果。
在这里插入图片描述

bar13 = (
    Geo()
    .add_schema(maptype='china', itemstyle_opts=opts.ItemStyleOpts(color='#404a59'))
    .add("数据"+str(end_data_time), pconfirmed_geo, label_opts=opts.LabelOpts(is_show=True, formatter="{b}{c}"))
    .set_series_opts(label_opts=opts.LabelOpts(is_show=True, formatter="{b}{c}"), type='heatmap')
    .set_global_opts(
        visualmap_opts=opts.VisualMapOpts(max_=5, is_piecewise=False),
        title_opts=opts.TitleOpts(title="全国新型冠状病毒疫情热力图")
)
    )
make_snapshot(snapshot, bar13.render(), "全国热力图.png")
bar13.render("全国热力图.html")

在这里插入图片描述

bar11 = (
    Geo()
    .add_schema(maptype="china", itemstyle_opts=opts.ItemStyleOpts(color='#404a59'))
    .add("数据"+str(end_data_time), cconfirmed_geo)
    .set_series_opts(label_opts=opts.LabelOpts(is_show=False, formatter="{c}"), type='effectScatter')
    .set_global_opts(
        visualmap_opts=opts.VisualMapOpts(is_piecewise=False),
        title_opts=opts.TitleOpts(title="全国疫情分布散点图"+"(数据"+str(end_data_time)+")")
        )
    )
make_snapshot(snapshot, bar11.render(), "全国散点图.png")
bar11.render("全国散点图.html")

在这里插入图片描述

pname_list = pname_list[:15]
pconfirmed_list = pconfirmed_list[:15]
bar2 = (
    Bar()
    .add_xaxis(pname_list)
    .add_yaxis("数据"+str(end_data_time), pconfirmed_list)
    .set_series_opts(label_opts=opts.LabelOpts(position="top"))
    .set_global_opts(title_opts=opts.TitleOpts(title="确诊人数排名前十五的省份")
    )
)
make_snapshot(snapshot, bar2.render(), "前十五省份柱状图.png")
bar2.render("前十五省份柱状图.html")

在这里插入图片描述

map_1 = Map()
map_1.set_global_opts(
    title_opts=opts.TitleOpts(title=str(test_name)+"新型冠状病毒疫情分布情况"),
    visualmap_opts=opts.VisualMapOpts(max_=30, is_piecewise=False)
    )
map_1.add(
    "数据截至"+str(end_data_time), hei_geo, maptype=test_name,
    label_opts=opts.LabelOpts(is_show=True, formatter="{b}{c}")
    )
make_snapshot(snapshot, map_1.render(), str(test_name)+"分布情况.png")
map_1.render(str(test_name)+"分布情况.html")

在这里插入图片描述

map_2 = Map()
map_2.set_global_opts(
    title_opts=opts.TitleOpts(title="全国新型冠状病毒疫情分布情况"),
    visualmap_opts=opts.VisualMapOpts(is_piecewise=True, pieces=[
        {"max": 99999, "min": 900, "label": ">900"},
        {"max": 899, "min": 400, "label": "400-899"},
        {"max": 399, "min": 100, "label": "100-399"},
        {"max": 99, "min": 10, "label": "10-99"},
        {"max": 9, "min": 1, "label": "1-9"}
        ])
    )
map_2.add(
    "数据"+str(end_data_time), pconfirmed_geo, maptype='china',
    label_opts=opts.LabelOpts(is_show=True, formatter="{b}{c}")
    )
make_snapshot(snapshot, map_2.render(), "全国分布情况.png")
map_2.render("全国分布情况.html")

在这里插入图片描述
注意,Pyecharts只能生成PNG和GIF格式的图片,JPG是不可的,否则会报错。
接下来可有可无,把这些东西在窗口自动弹出。

win1 = tk.Tk()
win1.geometry('1360x700')
win1.title('新型冠状病毒疫情可视化系统')
Label(win1, text=str(end_data_time)+'   全国新型冠状病毒确诊人数为'+str(n_confirmed_data)+'   死亡人数为'+str(n_dead_data), font=("微软雅黑", 18), fg='black').pack()
img_gif1 = tk.PhotoImage(file='全国分布情况.png')
label_img1 = tk.Label(win1, image=img_gif1)
label_img1.pack()
win1.mainloop()

win2 = tk.Tk()
win2.geometry('1360x700')
win2.title('新型冠状病毒疫情可视化系统')
Label(win2, text=str(end_data_time)+'   全国新型冠状病毒确诊人数为'+str(n_confirmed_data)+'   死亡人数为'+str(n_dead_data), font=("微软雅黑", 18), fg='black').pack()
img_gif2 = tk.PhotoImage(file='前十五省份柱状图.png')
label_img2 = tk.Label(win2, image=img_gif2)
label_img2.pack()
win2.mainloop()

win3 = tk.Tk()
win3.geometry('1360x700')
win3.title('新型冠状病毒疫情可视化系统')
Label(win3, text=str(end_data_time)+'   全国新型冠状病毒确诊人数为'+str(n_confirmed_data)+'   死亡人数为'+str(n_dead_data), font=("微软雅黑", 18), fg='black').pack()
img_gif3 = tk.PhotoImage(file='全国热力图.png')
label_img3 = tk.Label(win3, image=img_gif3)
label_img3.pack()
win3.mainloop()

win4 = tk.Tk()
win4.geometry('1360x700')
win4.title('新型冠状病毒疫情可视化系统')
Label(win4, text=str(end_data_time)+'   全国新型冠状病毒确诊人数为'+str(n_confirmed_data)+'   死亡人数为'+str(n_dead_data), font=("微软雅黑", 18), fg='black').pack()
img_gif4 = tk.PhotoImage(file='全国散点图.png')
label_img4 = tk.Label(win4, image=img_gif4)
label_img4.pack()
win4.mainloop()

win5 = tk.Tk()
win5.geometry('1360x700')
win5.title('新型冠状病毒疫情可视化系统')
Label(win5, text=str(end_data_time)+str(test_name)+'新型冠状病毒确诊人数为'+str(hei_all), font=("微软雅黑", 18), fg='black').pack()
img_gif5 = tk.PhotoImage(file=str(test_name)+'分布情况.png')
label_img5 = tk.Label(win5, image=img_gif5)
label_img5.pack()
win5.mainloop()

win6 = tk.Tk()
win6.geometry('1360x700')
win6.title('新型冠状病毒疫情可视化系统')
Label(win6, text=str(end_data_time)+str(test_name)+'新型冠状病毒确诊人数为'+str(hei_all), font=("微软雅黑", 18), fg='black').pack()
img_gif6 = tk.PhotoImage(file=str(test_name)+'热力图.png')
label_img6 = tk.Label(win6, image=img_gif6)
label_img6.pack()
win6.mainloop()

这些就是我生成的所有的图片。
在这里插入图片描述
最后,感谢大家看完,有问题就给我留言。

发布了7 篇原创文章 · 获赞 4 · 访问量 3078

猜你喜欢

转载自blog.csdn.net/qq_39634669/article/details/104285196