自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

僅需100行代碼即可實現(xiàn)疫情地圖可視化,原理是什么?

開發(fā) 前端
這個春節(jié),大家都在密切關注著疫情的進展。不少人每天醒來打開手機的第一件事,便是查看家鄉(xiāng)的疫情圖。

前言

這個春節(jié),大家都在密切關注著疫情的進展。不少人每天醒來打開手機的第一件事,便是查看家鄉(xiāng)的疫情圖。你所看到的可能是這樣的:

????

又或者是這樣的:

疫情進展牽動著我們的心。作為一名開發(fā)者,我們閉門在家為抗擊疫情做貢獻的同時,也可以繼續(xù)深耕自己的技術。此文章旨在向大家介紹疫情地圖可視化的原理,幫助大家深入理解echart。

核心思路

疫情圖的核心在于疫情數(shù)據(jù)整理以及疫情數(shù)據(jù)可視化。

疫情數(shù)據(jù)整理

本文疫情數(shù)據(jù)是由網(wǎng)易新聞的公開數(shù)據(jù)整理而成,僅用于demo 展示。數(shù)據(jù)的具體地址已在代碼中說明:此地址是一個 Get 請求,大家可以先拷貝地址到瀏覽器中查看數(shù)據(jù)格式。請求成功后服務端響應的數(shù)據(jù)格式如下(文中僅羅列出我們需要的數(shù)據(jù)。

data 里面的參數(shù)

??

Object 里面的參數(shù)

??

疫情數(shù)據(jù)可視化

地圖是數(shù)據(jù)可視化的一種常用工具,我們用地圖來展示疫情的具體分布。本文采用的是開源的 pyecharts項目,方便開發(fā)者用于地圖展示。其中,pyecharts 是一個幫助生成 Echarts 圖表的類庫;而 Echarts 則是百度開源的數(shù)據(jù)可視化 JS 庫,支持折線圖、柱狀圖、散點圖、K線圖、餅圖、雷達圖、和弦圖、力導向布局圖、地圖、儀表盤、漏斗圖、事件河流圖等12類圖表,并可以在 PC 和移動設備上流暢地運行,兼容當前絕大部分瀏覽器。pyecharts 是在 Python 的基礎上對 Echarts 所進行的擴展。

原理詳解

接下來,本文將為大家詳細說明如何搭建環(huán)境、整合數(shù)據(jù)、使用 pyecharts 來做數(shù)據(jù)可視化以及如何調(diào)試項目。

環(huán)境搭建

為了快速開發(fā)此功能并且盡可能地縮減代碼量,此 demo 選擇使用 Python 來進行開發(fā)。為此,我們應該準備好Python 的開發(fā)環(huán)境并導入python 基礎庫。

安裝 Python 環(huán)境

Mac 上面自帶了 Python2.7 ,其他機型的電腦可以參考網(wǎng)上相關的安裝教程

安裝 pip

pip 是 Python 包管理工具,使用該工具可以快速地對Python 包予以查找、下載、安裝、卸載等。如果你是在 python.org上下載的最新版本的安裝包,則系統(tǒng)已經(jīng)自帶該工具。此外, Python 2.7.9 + 和 Python 3.4+ 以上版本都自帶 pip 工具??梢允褂谩皃ip –version”命令行來查看當前 pip 的版本。

如果本機沒有 配置Python 環(huán)境的,我們可以在線安裝,只需要在終端輸入以下 2 行命令即可。

$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ sudo python get-pip.py

安裝工程所需要的插件

在代碼中大家不難發(fā)現(xiàn)我們導入了一些開源的庫:

import math
import time
from fake_useragent import UserAgent
from pyecharts.charts import Map
from pyecharts import options as opts
import requests
import json
import sys

請求網(wǎng)絡數(shù)據(jù)需要用到的插件:

pip install fake_useragent # 偽裝請求,隨機生成UserAgent
pip install requests # HTTP請求庫。

地圖展示需要用到的插件:

pip install echarts-countries-pypkg  # 世界地圖
pip install echarts-china-provinces-pypkg # 中國省級地圖
pip install echarts-china-cities-pypkg # 中國城市地圖

我們把上述的命令行復制到終端,逐行執(zhí)行即可。

數(shù)據(jù)整合& 過濾

代碼依然簡潔明了,我們可以直接使用 requests 庫構建一個 GET 請求,服務器響應的數(shù)據(jù)即為“ 全國所有城市的疫情情況”。

ua = UserAgent(verify_ssl=False)
headers = {'User-Agent': ua.random}
url = "https://c.m.163.com/ug/api/wuhan/app/index/feiyan-data-list?t=1580469818264"


def getEpidemicInfo(url):
try:
response = requests.get(url, headers=headers)
print(response.status_code)
if response.status_code == 200:
content_field = json.loads(response.text)
epidemicInfo = content_field['data']['list']
return epidemicInfo
else:
print('請求錯誤碼:' + response.status_code)
return None
except Exception as e:
print('此頁有問題!', e)
return None

請求地址里面的 t 代表時間戳。我們輸入上述代碼,計算機便會輸出前文所提及格式的數(shù)據(jù)。注意:拿到數(shù)據(jù)后還要進行過濾,我們僅需獲得某個省份、自治州所包含的地級市或者是某個直轄市所包含的下屬區(qū)縣的疫情信息即可。

通過以下代碼,我們對有關數(shù)據(jù)予以篩選:

# 生成本省疫情列表
def makedict(list):
cityList = {}
for item in list:
for k, v in item.items():
# 1
if v == sys.argv[1]:
#2
if str(item["confirm"]).isdigit():
# 3
if v == "北京" or v == "上海" or v == "天津":
cityList[item['name'] + '區(qū)'] = int(item["confirm"])
elif "自治州" in v:
continue
else:
cityList[item['name'] + '市'] = int(item["confirm"])
return cityList


  1. sys.argv[1] 是一個傳參,代表我們手動輸入的省份、自治區(qū)、直轄市或特別行政區(qū),比如浙江、新疆、北京、香港等;
  2. “confirm” 關鍵字用于匹配響應結果的 value 值,在上文疫情數(shù)據(jù)整合里有提及,代表當前城市的疫情人數(shù);
  3. pyecharts 是根據(jù)城市的全稱來適配的,此處需對數(shù)據(jù)格式中的地級市或者是下屬區(qū)縣進行排查,如果有城市采用簡稱的,需要進行調(diào)試,(如接口返回的城市名是恩施,我們則需要適配成恩施土家族苗族自治州),從而防止地圖展示異常。

舉例來講,當我們輸入浙江時,計算機最后輸出的數(shù)據(jù)格式為:

{'湖州市': 9, '麗水市': 16, '舟山市': 7, '衢州市': 15, '金華市': 47, '嘉興市': 30, '紹興市': 33, '寧波市': 126, '臺州市': 124, '杭州市': 151, '溫州市': 396}

數(shù)據(jù)可視化

這是最核心的一步。makeEpidemicInfoMap方法里面的 dict 對應我們過濾得到的數(shù)據(jù):

def makeEpidemicInfoMap(dict):

# 省和直轄市
province_distribution = dict
value = province_distribution.values()
print(province_distribution)
title = str(int(time.strftime("%Y%m%d")) - 1) + sys.argv[1] + "疫情地圖"
epidemicCount = []
for k, v in dict.items():
epidemicCount.append(v)
# 1
epidemicCount.sort(reverse=True)
maxEpidemic = handle(epidemicCount.pop(0))
maxEpidemic = int(maxEpidemic)
# 2
map = Map()
# 3
map.set_global_opts(
title_opts=opts.TitleOpts(title=title),
visualmap_opts=opts.VisualMapOpts(max_=200, is_piecewise=True,
pieces=[
{"max": 9999999, "min": maxEpidemic, "label": ">" + str(maxEpidemic),
"color": "#780707"}, # 數(shù)據(jù)范圍分段,分顏色,可以根據(jù)數(shù)據(jù)大小具體分配大小
{"max": int(maxEpidemic), "min": int(maxEpidemic / 8) * 7,
"label": str(int(maxEpidemic / 8) * 7) + "-" + str(int(maxEpidemic)),
"color": "#B40404"},
{"max": int(maxEpidemic / 8) * 7, "min": int(maxEpidemic / 8) * 4,
"label": str(int(maxEpidemic / 8) * 4) + "-" + str(
int(maxEpidemic / 8) * 7 - 1), "color": "#CD1111"},
{"max": int(maxEpidemic / 8) * 4, "min": int(maxEpidemic / 8),
"label": str(int(maxEpidemic / 8)) + "-" + str(
int(maxEpidemic / 8) * 4 - 1), "color": "#F68181"},
{"max": int(maxEpidemic / 8), "min": 1,
"label": "1-" + str(int(maxEpidemic / 8)), "color": "#F5A9A9"},
{"max": 0, "min": 0, "label": "0", "color": "#FFFFFF"},
], ) # 最大數(shù)據(jù)范圍,分段
)
# 4
map.add(title, data_pair=province_distribution.items(), maptype=sys.argv[1], is_roam=True)
map.render(sys.argv[1] + '疫情地圖.html')


  1. 根據(jù)所選省份各城市的確診人數(shù)對所有城市進行降序并得到當前省份確診人數(shù)最多的城市名稱。maxEpidemic 是最接近該城市確診人數(shù)的高位數(shù),比如當前省份疫情最為嚴重的城市的確診數(shù)量為“357”,則 maxEpidemic=300 ,引入此參數(shù)的目的是讓地圖呈現(xiàn)效果更加清晰直觀。
  2. 用PyEcharts繪制地圖需要對Map對象進行初始化,以用于地理區(qū)域數(shù)據(jù)的可視化。
  3. 以建造者模式對 map 進行設值,其中,VisualMapOpts 是 PyEcharts 的視覺映射配置項。


# 指定 visualMapPiecewise 組件的最大值。
max =100
# 是否為分段型
is_piecewise: bool = False,

# 自定義的每一段的范圍,以及每一段的文字,以及每一段的特別的樣式。例如:
# pieces: [
# {"min": 1500}, // 不指定 max,表示 max 為無限大(Infinity)。
# {"min": 900, "max": 1500},
# {"min": 310, "max": 1000},
# {"min": 200, "max": 300},
# {"min": 10, "max": 200, "label": '10 到 200(自定義label)'},
# {"value": 123, "label": '123(自定義特殊顏色)', "color": 'grey'}, //表示 value 等于 123 的情況
# {"max": 5} // 不指定 min,表示 min 為無限大(-Infinity)。
# ]

詳細配置可以見 PyEcharts 官網(wǎng)。此處的范圍分為6 段,每一段的范圍均是根據(jù)上述計算出來的 maxEpidemic 進行動態(tài)調(diào)整的,目的是為了保證疫情圖的視覺效果,這里面我僅是做了非常簡略的范圍模型,僅供參考

  1. 使用 PyEcharts 在當前目錄下面生成一個網(wǎng)頁

調(diào)試

執(zhí)行 python map.py [省份],如:

python /Users/xxx/map.py 浙江

會在當前目錄下面得到一份名字為 浙江疫情地圖.html 的文件,直接使用瀏覽器打開即可,最后的展示效果是不是很酷。

??





??





??

總結

讀完此篇文章,希望大家可以對數(shù)據(jù)可視化有個初步的了解。全民戰(zhàn)“疫”期間,個推服務的腳步不會停歇,我們將一如既往地為開發(fā)者提供技術支持。此外,個推“防災速報”小程序還上線了 “新型肺炎疫情實時動態(tài)”新功能,為大家進行疫情防護提供可靠的數(shù)據(jù)支持。

責任編輯:華軒 來源: segmentfault
相關推薦

2017-09-05 08:35:09

Python可視化地圖

2017-09-01 19:49:50

Python工具地圖

2020-03-11 14:39:26

數(shù)據(jù)可視化地圖可視化地理信息

2014-01-17 10:36:39

2022-03-01 10:29:44

Kubernetes容器

2021-06-21 09:37:05

代碼開源可視化

2017-10-14 13:54:26

數(shù)據(jù)可視化數(shù)據(jù)信息可視化

2023-01-12 08:07:03

Python代碼版權

2021-03-17 08:07:56

Python可視化工具

2013-10-22 10:37:47

谷歌數(shù)據(jù)可視化

2021-03-18 08:11:18

PythonDash工具

2022-03-21 10:13:09

sftp 服務器參數(shù)配置

2021-08-05 13:52:05

大大數(shù)據(jù)疫情數(shù)據(jù)可視化

2016-12-16 12:13:11

VR數(shù)據(jù)可視化

2015-10-29 09:36:48

2023-02-07 11:44:02

2014-06-20 15:00:57

數(shù)據(jù)可視化

2015-06-09 14:49:38

2023-12-06 18:09:01

2014-05-28 15:23:55

Rave
點贊
收藏

51CTO技術棧公眾號