百度热力图,相信大家每天都会刷上好多遍。带领大家使用Python可视化构来建自己的热力分布图。
一、使用爬虫获取信息数据
爬取的数据网站是:丁香园数据网(打击权健,质量保证)
地址:https://3g.dxy.cn/newh5/view/pneumonia_peopleapp
from urllib.request import urlopen
from bs4 import BeautifulSoup
#使用urlopen读取网页内容。
html = urlopen(
"https://3g.dxy.cn/newh5/view/pneumonia_peopleapp"
).read().decode('utf-8')
#BeautifulSoup用来解析和提取HTML/XML的数据
bs= BeautifulSoup(html,"html.parser")
#bs.body
二、使用对信息数据做处理
str1=bs.body.text
#根据字符串对应数据的关键字,进行数据截取
str1=str1[str1.find('window.getAreaStat = '):]
#截取从“[{” 到 “}catch” 间的字符串
data = str1[str1.find('[{'):str1.find('}catch')]
data_list=eval(data) #字符串转字典数组
new_dict={} #省份现存数
for province in data_list:
#循环遍历,将省份现存数放入new_dict字典中,处理不合格的省份名称replace
new_dict[province['provinceName'].replace('自治区','').replace('回族','')
.replace('维吾尔','').replace('省','').replace('市','').replace('壮族','')] \
= province['currentConfirmedCount']
#print(new_dict)
三、绘制中国热力图并保存
from pyecharts.charts import Map,Geo
from pyecharts import options as opts
from pyecharts.globals import ThemeType
import pandas as pd
import re
#将字典中的省份以列表的形式取出来
province=list(new_dict.keys())
values=list(new_dict.values())
list1 = [[province[i],values[i]] for i in range(len(province))] #列表生成
map_1 = Map()
map_1.set_global_opts(
title_opts=opts.TitleOpts(title="中国疫情状况",pos_left="left"),
visualmap_opts=opts.VisualMapOpts(
is_piecewise=True, # 设置是否为分段显示
# 自定义范围,文字,样式。
pieces=[
{"max":0,"label":"0人","color":"#FFFFFF"},
{"min":1,"max":9,"label":"1-10人","color":"#FFEBCD"},
{"min":10,"max":99,"label":"10-99人","color":"#FFA07A"},
{"min":100,"max":499,"label":"100-499人","color":"#FF4040"},
{"min":500,"max":999,"label":"500-999人","color":"#CD2626"},
{"min":1000,"max":10000,"label":"1000-10000人","color":"#B22222"},
{'min':10000,"label":">10000人","color":"#8B1A1A"}
] )
)
#is_map_symbol_show设置是否显示地图上的小红点
map_1.add("中国现存热力数据", list1, maptype="china", is_map_symbol_show=False)
map_name = "中国现存热力分布图.html"
map_1.render("./" + map_name)
map_1.render_notebook()
四、使用谷歌浏览器自动化展示;
from selenium import webdriver
browser = webdriver.Chrome('./Chromedriver')
browser.get('file:///Users/dinglibin/AITraining/基于Python的数据分析/'+ map_name)
五、绘制世界热力图并展示
html = urlopen(
"https://3g.dxy.cn/newh5/view/pneumonia_peopleapp"
).read().decode('utf-8')
#获取网站源
bs= BeautifulSoup(html,"html.parser")
# 热力数据
str1 = bs.body.text
info = re.findall(r'try(.*?)catch',str1)
# 全球热力数据
world = info[0]
world = world.replace(' { window.getListByCountryTypeService2true = ','')[:-1]
# 数据转换为 python 对象
world_list =json.loads(world)
# 中英文转换
plt.rcParams['font.sans-serif'] = ['SimHei']
# 保存数据
data = pd.read_csv('./world_info.csv')
country = list(data['英文名'])
value = list(data['当前热力'])
pieces=[
{"max":0,"label":"0人","color":"#FFFFFF"},
{"min":1,"max":9,"label":"1-9人","color":"#FFEBCD"},
{"min":10,"max":99,"label":"10-99人","color":"#FFA07A"},
{"min":100,"max":499,"label":"100-499人","color":"#FF7F50"},
{"min":500,"max":999,"label":"500-999人","color":"#CD4F39"},
{'min':1000,"max":10000,"label":"1000-10000人","color":"#CD3333"},
{'min':10000,"label":">10000人","color":"#8B0000"}
]
#绘制地图
map1 = Map()
map1.set_global_opts(
title_opts=opts.TitleOpts(title="全球热力状况",pos_left="left"),
visualmap_opts=opts.VisualMapOpts(
is_piecewise=True,
pieces = pieces
)
)
map1.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
map1.add('全球现存热力数据',[list(z) for z in zip(country,value)],
maptype='world',is_map_symbol_show=False,label_opts=opts.LabelOpts(is_show=False))
map1.render_notebook()
# map1_name = "全球现存热力分布图.html"
# map1.render("./" + map1_name)
# browser = webdriver.Chrome('./Chromedriver')
# browser.get('file:///Users/dinglibin/AITraining/基于Python的数据分析/'+ map1_name)