Echarts 是一個由百度開源的數據可視化,憑藉着良好的交互性,精巧的圖表設計,獲得了衆多開發者的承認。而 Python 是一門富有表達力的語言,很適合用於數據處理。當數據分析趕上數據可視化時,pyecharts 誕生了。
若是想要掌握pyecharts,能夠閱讀pyecharts中文文檔,裏面的圖表類型和配置項寫的很是詳細,我就不過多的贅述了html
安裝的命令也很是簡單:json
pip install pyecharts
安裝成功:
api
咱們能夠嘗試運行官方文檔所給出的幾個小例子來測試一下pyecharts模塊是否成功安裝
打開編輯器,輸入並運行如下代碼:app
from pyecharts.charts import Bar from pyecharts import options as opts # 內置主題類型可查看 pyecharts.globals.ThemeType from pyecharts.globals import ThemeType bar = ( Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)) .add_xaxis(["襯衫", "羊毛衫", "雪紡衫", "褲子", "高跟鞋", "襪子"]) .add_yaxis("商家A", [5, 20, 36, 10, 75, 90]) .add_yaxis("商家B", [15, 6, 45, 20, 35, 66]) .set_global_opts(title_opts=opts.TitleOpts(title="主標題", subtitle="副標題")) ) bar.render() #保存爲html文件
若此時在當前目錄下生成了一個名爲render.html的文件
echarts
打開此文件,看到以下的圖片則證實安裝模塊成功
框架
想要製做全球疫情的地圖(空氣質量圖,人口分佈圖也是同理),首先須要的就是每一個國家的疫情數據,好比人數,治癒數,增加數...... 那麼咱們該如何獲取到這些信息呢?dom
咱們發現不少app和網頁上都會有最新的疫情信息公佈,我選取的數據來源是騰訊地圖。
首先打開騰訊地圖的疫情信息頁,能夠發現疫情的信息展示在這一頁中
編輯器
獲取這些信息的方法有不少種,能夠是用表達式提取,也能夠抓包分析,我更喜歡的一種方法是抓包分析。post
右擊《檢查》,點擊《network》選項卡並刷新界面,看到加載出來不少數據包,找到裏面最像列表的一個list數據包
測試
此時發現,這個list數據包正式咱們要提取的數據列表,裏面的每一個鍵值對都表明着相應的數據,提取到這些鍵值對就能夠獲取到全部的數據信息了,再次回到headers,選項卡下面對應的網址就是咱們即將請求的網址,這裏咱們須要注意的是,這個網址對應的請求是post而不是咱們常常使用的get
向網頁請求數據:
import requests url = 'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist' response = requests.post(url).text print(response)
能夠看到這個網頁並無設置反爬蟲,能夠輕鬆的獲取到數據
咱們剛剛請求到的數據格式是字符格式,並不能被咱們直接提取到,必須想將字符格式的數據轉換爲字典格式才能夠開始下一步的提取
resp = json.loads(response) #使用變量resp來接收字典格式的數據
將變量轉化爲字典格式後,就要開始提取數據了 提取json類型的數據可使用取出列表元素的方法來提取,即先遍歷列表將每一個國家的信息提取出來,再分別從這些條信息中提取到咱們想要的數據
提取數據:
import json resp = json.loads(response) #使用變量resp來接收字典格式的數據 for data in resp['data']: #遍歷提取每一個國家的疫情數據 name = data['name'] #國家名 confirm = data['confirm'] #該國家疫情人數 print(name,confirm)
打印數據:
在獲得了國家和人數信息以後,還須要將數據存儲到字典中才能傳入圖表中,這就須要咱們手動的轉換數據,並儲存到字典中
map_version = {} #定義空字典 for data in resp['data']: #遍歷提取每一個國家的疫情數據 name = data['name'] #國家名 confirm = data['confirm'] #該國家疫情人數 map_version[name] = int(confirm) #將國家和人數以鍵值對的形式傳入字典
輸出字典:
此時打印出來的字典是標準的字典格式,可是這種格式並非pyecharts所要求的格式,因此還須要一行代碼來進行轉換
element = list(map_version.items())
而後就能夠輸出傳入數據的標準格式:
在將數據爬取、變換、整理後,全部準備工做都已經作完,下面咱們來調用數據實現數據可視化
先寫出一個初步的框架來接收內容
from pyecharts.charts import Map,Geo map = Map().add(series_name="世界疫情分佈圖", #名稱 data_pair=element, #傳入數據 maptype='world', #地圖類型 ) map.render('map.html') #命名並保存
運行代碼,發現當前文件夾下出現了一個map.html文件,雙擊運行
看到這個圖表以後,發現代碼的運行並無問題,可是數據卻沒有傳到地圖中,這是因爲pyecharts默認的世界地圖中的國家名是英文,因此咱們就要傳入一個字典來替代掉這些英文
生成了地圖以後,接下來就是要保證地圖的正確性和美觀,因此咱們要來設置世界地圖
地圖上顯示國家名太多,影響可讀性,因此設置爲不顯示國家名
from pyecharts import options map.set_series_opts(label_opts=options.LabelOpts(is_show=False)) #不顯示國家名
按照感染人數的不一樣,給地圖添加不一樣的顏色
#設置全局配置項 map.set_global_opts(visualmap_opts=options.VisualMapOpts(max_=1100000,is_piecewise=True,pieces=[ {"min": 500000}, {"min": 200000, "max": 499999}, {"min": 100000, "max": 199999}, {"min": 50000, "max": 99999}, {"min": 10000, "max": 49999}, {"max": 9999},]))
表明國家首都的圓點不美觀,去掉紅點:
map = Map().add( is_map_symbol_show=False, #不顯示標記 )
設置背景顏色併爲網頁取名:
map = Map(options.InitOpts(bg_color="#87CEFA",page_title='世界疫情分佈')).add()
到了如今全部的配置已經完成,可是圖表要想顯示數據還須要傳入一個字典來替換掉默認的英文名,具體實現請看下面的完整代碼。
import requests import json from pyecharts.charts import Map from pyecharts import options url = 'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist' response = requests.post(url).text resp = json.loads(response) #使用變量resp來接收字典格式的數據 map_version = {} #定義空字典 for data in resp['data']: #遍歷提取每一個國家的疫情數據 name = data['name'] #國家名 confirm = data['confirm'] #該國家疫情人數 map_version[name] = int(confirm) #將國家和人數以鍵值對的形式傳入字典 element = list(map_version.items()) #將字典值調整爲能夠傳入地圖的格式 name_map = { 'Singapore Rep.': '新加坡', 'Dominican Rep.': '多米尼加', 'Palestine': '巴勒斯坦', 'Bahamas': '巴哈馬', 'Timor-Leste': '東帝汶', 'Afghanistan': '阿富汗', 'Guinea-Bissau': '幾內亞比紹', "Côte d'Ivoire": '科特迪瓦', 'Siachen Glacier': '錫亞琴冰川', "Br. Indian Ocean Ter.": '英屬印度洋領土', 'Angola': '安哥拉', 'Albania': '阿爾巴尼亞', 'United Arab Emirates': '阿聯酋', 'Argentina': '阿根廷', 'Armenia': '亞美尼亞', 'French Southern and Antarctic Lands': '法屬南半球和南極領地', 'Australia': '澳大利亞', 'Austria': '奧地利', 'Azerbaijan': '阿塞拜疆', 'Burundi': '布隆迪', 'Belgium': '比利時', 'Benin': '貝寧', 'Burkina Faso': '布基納法索', 'Bangladesh': '孟加拉國', 'Bulgaria': '保加利亞', 'The Bahamas': '巴哈馬', 'Bosnia and Herz.': '波斯尼亞和黑塞哥維那', 'Belarus': '白俄羅斯', 'Belize': '伯利茲', 'Bermuda': '百慕大', 'Bolivia': '玻利維亞', 'Brazil': '巴西', 'Brunei': '文萊', 'Bhutan': '不丹', 'Botswana': '博茨瓦納', 'Central African Rep.': '中非', 'Canada': '加拿大', 'Switzerland': '瑞士', 'Chile': '智利', 'China': '中國', 'Ivory Coast': '象牙海岸', 'Cameroon': '喀麥隆', 'Dem. Rep. Congo': '剛果民主共和國', 'Congo': '剛果', 'Colombia': '哥倫比亞', 'Costa Rica': '哥斯達黎加', 'Cuba': '古巴', 'N. Cyprus': '北塞浦路斯', 'Cyprus': '塞浦路斯', 'Czech Rep.': '捷克', 'Germany': '德國', 'Djibouti': '吉布提', 'Denmark': '丹麥', 'Algeria': '阿爾及利亞', 'Ecuador': '厄瓜多爾', 'Egypt': '埃及', 'Eritrea': '厄立特里亞', 'Spain': '西班牙', 'Estonia': '愛沙尼亞', 'Ethiopia': '埃塞俄比亞', 'Finland': '芬蘭', 'Fiji': '斐', 'Falkland Islands': '福克蘭羣島', 'France': '法國', 'Gabon': '加蓬', 'United Kingdom': '英國', 'Georgia': '格魯吉亞', 'Ghana': '加納', 'Guinea': '幾內亞', 'Gambia': '岡比亞', 'Guinea Bissau': '幾內亞比紹', 'Eq. Guinea': '赤道幾內亞', 'Greece': '希臘', 'Greenland': '格陵蘭', 'Guatemala': '危地馬拉', 'French Guiana': '法屬圭亞那', 'Guyana': '圭亞那', 'Honduras': '洪都拉斯', 'Croatia': '克羅地亞', 'Haiti': '海地', 'Hungary': '匈牙利', 'Indonesia': '印度尼西亞', 'India': '印度', 'Ireland': '愛爾蘭', 'Iran': '伊朗', 'Iraq': '伊拉克', 'Iceland': '冰島', 'Israel': '以色列', 'Italy': '意大利', 'Jamaica': '牙買加', 'Jordan': '約旦', 'Japan': '日本', 'Kazakhstan': '哈薩克斯坦', 'Kenya': '肯尼亞', 'Kyrgyzstan': '吉爾吉斯斯坦', 'Cambodia': '柬埔寨', 'Korea': '韓國', 'Kosovo': '科索沃', 'Kuwait': '科威特', 'Lao PDR': '老撾', 'Lebanon': '黎巴嫩', 'Liberia': '利比里亞', 'Libya': '利比亞', 'Sri Lanka': '斯里蘭卡', 'Lesotho': '萊索托', 'Lithuania': '立陶宛', 'Luxembourg': '盧森堡', 'Latvia': '拉脫維亞', 'Morocco': '摩洛哥', 'Moldova': '摩爾多瓦', 'Madagascar': '馬達加斯加', 'Mexico': '墨西哥', 'Macedonia': '馬其頓', 'Mali': '馬裏', 'Myanmar': '緬甸', 'Montenegro': '黑山', 'Mongolia': '蒙古', 'Mozambique': '莫桑比克', 'Mauritania': '毛里塔尼亞', 'Malawi': '馬拉維', 'Malaysia': '馬來西亞', 'Namibia': '納米比亞', 'New Caledonia': '新喀里多尼亞', 'Niger': '尼日爾', 'Nigeria': '尼日利亞', 'Nicaragua': '尼加拉瓜', 'Netherlands': '荷蘭', 'Norway': '挪威', 'Nepal': '尼泊爾', 'New Zealand': '新西蘭', 'Oman': '阿曼', 'Pakistan': '巴基斯坦', 'Panama': '巴拿馬', 'Peru': '祕魯', 'Philippines': '菲律賓', 'Papua New Guinea': '巴布亞新幾內亞', 'Poland': '波蘭', 'Puerto Rico': '波多黎各', 'Dem. Rep. Korea': '朝鮮', 'Portugal': '葡萄牙', 'Paraguay': '巴拉圭', 'Qatar': '卡塔爾', 'Romania': '羅馬尼亞', 'Russia': '俄羅斯', 'Rwanda': '盧旺達', 'W. Sahara': '西撒哈拉', 'Saudi Arabia': '沙特阿拉伯', 'Sudan': '蘇丹', 'S. Sudan': '南蘇丹', 'Senegal': '塞內加爾', 'Solomon Is.': '所羅門羣島', 'Sierra Leone': '塞拉利昂', 'El Salvador': '薩爾瓦多', 'Somaliland': '索馬里蘭', 'Somalia': '索馬里', 'Serbia': '塞爾維亞', 'Suriname': '蘇里南', 'Slovakia': '斯洛伐克', 'Slovenia': '斯洛文尼亞', 'Sweden': '瑞典', 'Swaziland': '斯威士蘭', 'Syria': '敘利亞', 'Chad': '乍得', 'Togo': '多哥', 'Thailand': '泰國', 'Tajikistan': '塔吉克斯坦', 'Turkmenistan': '土庫曼斯坦', 'East Timor': '東帝汶', 'Trinidad and Tobago': '特里尼達和多巴哥', 'Tunisia': '突尼斯', 'Turkey': '土耳其', 'Tanzania': '坦桑尼亞', 'Uganda': '烏干達', 'Ukraine': '烏克蘭', 'Uruguay': '烏拉圭', 'United States': '美國', 'Uzbekistan': '烏茲別克斯坦', 'Venezuela': '委內瑞拉', 'Vietnam': '越南', 'Vanuatu': '瓦努阿圖', 'West Bank': '西岸', 'Yemen': '也門', 'South Africa': '南非', 'Zambia': '贊比亞', 'Zimbabwe': '津巴布韋', 'Comoros': '科摩羅' } map = Map(options.InitOpts(bg_color="#87CEFA",page_title='世界疫情分佈')).\ add(series_name="世界疫情分佈圖", #名稱 data_pair=element, #傳入數據 is_map_symbol_show=False, #不顯示標記 maptype='world', #地圖類型 name_map=name_map, ) #設置全局配置項 map.set_global_opts(visualmap_opts=options.VisualMapOpts(max_=1100000,is_piecewise=True,pieces=[ {"min": 500000}, {"min": 200000, "max": 499999}, {"min": 100000, "max": 199999}, {"min": 50000, "max": 99999}, {"min": 10000, "max": 49999}, {"max": 9999},])) #設置系列配置項 map.set_series_opts(label_opts=options.LabelOpts(is_show=False)) #不顯示國家名 map.render('map.html') #命名並保存
這個結果能夠動態的顯示在網頁中,能夠根據人數來篩選地圖的板塊,並且方便縮放