Python機器學習之使用Pyecharts制作可視化大屏
前言
ECharts是由百度開源的基於JS的商業級數據圖表庫,有很多現成的圖表類型和實例,而Pyecharts則是為瞭方便我們使用Python實現ECharts的繪圖。使用Pyecharts制作可視化大屏,可以分為兩步:
1、使用分別Pyecharts分別制作各類圖形;
2、使用Pyecharts中的組合圖表功能,將所有圖片拼接在一張html文件中進行展示。
小五認為影響大屏美觀最重要的兩個因素就是:配色和佈局!在本文中,會特意強調這兩點
Pyecharts可視化
本文縮減瞭圖表,隻選用2020東京奧運會各國金牌分佈圖、2020東京奧運會獎牌榜詳情、2020東京奧運會中國各項目獲獎詳情。
這類圖表都很簡單,參照官方文檔直接復制示例就可以學習。圖表配色都使用的Pyecharts默認顏色,大傢實際使用時盡量形成自己的風格。
爬取數據
import requests import pandas as pd from pprint import pprint url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609' data1 = requests.get(url).json() pprint(data1)
Map世界地圖
Pyecharts繪制世界地圖時,名稱必須是英文。所以我們在前文中引入瞭國傢名稱中英文對照表,左連接形成瞭df1:
df1 = pd.DataFrame() for info in data1['body']['allMedalData']: name = info['countryName'] name_id = info['countryId'] rank = info['rank'] gold = info['goldMedalNum'] silver = info['silverMedalNum'] bronze = info['bronzeMedalNum'] total = info['totalMedalNum'] # 組織數據 orangized_data = [[name,name_id,rank,gold,silver,bronze,total]] # 然後追加df df1 = df1.append(orangized_data) df1.columns = ['名稱', 'ID', '排名', '金牌', '銀牌', '銅牌', '獎牌總數'] df1
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609' data2 = requests.get(url).json() pprint(data2)
df2 = pd.DataFrame() for info in data2['body']['medalTableDetail']: english_name = info['countryName'] name_id = info['countryId'] award_time = info['awardTime'] item_name = info['bigItemName'] sports_name = info['sportsName'] medal_type = info['medalType'] # 組織數據 orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]] # 然後追加df df2 = df2.append(orangized_data) df2.columns = ['英文縮寫', 'ID', '獲獎時間', '項目名', '運動員', '金牌類型'] df2
數據預處理
with open("國傢名中英文對照表.txt","r",encoding="utf-8") as f: x = f.read() df3 = pd.DataFrame() for i in x.split("\n"): x = i.split(":")[0].strip() y = i.split(":")[1].strip() orangined_data = [[x,y]] df3 = df3.append(orangined_data) df3.columns = ["名稱","英文名稱"] df3.to_excel("國傢名中英文對照表.xlsx",index=None)
df4 = pd.merge(df1,df3,on="名稱",how="left") df4.head(10)
df5 = df2
df6 = pd.merge(df4,df5,on="ID",how="left") df6.head(10)
df6
x = {"獲獎名次":["金牌","銀牌","銅牌"],"金牌類型":[1,2,3]} df7 = pd.DataFrame(x) df7
df8 = pd.merge(df6,df7,on="金牌類型",how="left") df8.head(10)
df4.head(10)
Pyecharts可視化
單獨提取英文名稱和獎牌總數兩列數據,用來可視化。
data_list=[[i,j] for i,j in zip(df4['英文名稱'],df4['獎牌總數'])] data_list[:5]
數據準備好瞭,開始利用pyecharts繪制世界地圖。
from pyecharts import options as opts from pyecharts.charts import Map c = ( Map() .add("", data_list, "world", is_map_symbol_show=False, ) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) .set_global_opts( title_opts=opts.TitleOpts(title="2020東京奧運會各國總獎牌分佈圖"), visualmap_opts=opts.VisualMapOpts(max_=100) ) ) c.render_notebook()
非常簡單
金牌總數
data_list1=[[i,j] for i,j in zip(df4['英文名稱'],df4['金牌'])] data_list1[:5]
from pyecharts import options as opts from pyecharts.charts import Map c = ( Map() .add("", data_list1, "world", is_map_symbol_show=False, ) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) .set_global_opts( title_opts=opts.TitleOpts(title="2020東京奧運會各國金牌分佈圖"), visualmap_opts=opts.VisualMapOpts(max_=100) ) ) c.render_notebook()
銀牌總數
data_list2=[[i,j] for i,j in zip(df4['英文名稱'],df4['銀牌'])] data_list2[:5]
from pyecharts import options as opts from pyecharts.charts import Map c = ( Map() .add("", data_list2, "world", is_map_symbol_show=False, ) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) .set_global_opts( title_opts=opts.TitleOpts(title="2020東京奧運會各國銀牌分佈圖"), visualmap_opts=opts.VisualMapOpts(max_=100) ) ) c.render_notebook()
柱狀圖、餅圖
柱狀圖(Bar)
from pyecharts import options as opts from pyecharts.charts import Bar c = ( Bar() .add_xaxis(df4['名稱'].head(25).tolist()) .add_yaxis("金牌", df4['金牌'].head(25).tolist(), stack="stack1") .add_yaxis("銀牌", df4['銀牌'].head(25).tolist(), stack="stack1") .add_yaxis("銅牌", df4['銅牌'].head(25).tolist(), stack="stack1") .set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="inside", font_size=12, color='#FFFFFF')) .set_global_opts(title_opts=opts.TitleOpts(title="2020東京奧運會獎牌榜詳情"), xaxis_opts=opts.AxisOpts(type_='category', axislabel_opts=opts.LabelOpts( rotate=45), ))) c.render_notebook()
餅圖(Pie)
from pyecharts import options as opts from pyecharts.charts import Pie c = ( Pie() .add("", [['跳水', 12], ['射擊', 11], ['舉重', 8], ['競技體操', 8], ['乒乓球', 7], ['遊泳', 6], ['羽毛球', 6], ['田徑', 5], ['靜水皮劃艇', 3], ['蹦床體操', 3], ['自由式摔跤', 3], ['賽艇', 3], ['空手道', 2], ['拳擊', 2], ['帆船', 2], ['花樣遊泳', 2], ['跆拳道', 1], ['場地自行車賽', 1], ['古典式摔跤', 1], ['擊劍', 1], ['三人籃球', 1]], center=["50%", "60%"],) .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) ) c.render_notebook()
這樣需要用到的三張圖表就繪制好瞭。
Pyecharts組合圖表
Pyecharts進行可視化大屏第二步就是組合圖表,大致可分為四類:
- Grid:並行多圖
- Page:順序多圖
- Tab:選項卡多圖
- Timeline:時間線輪播多圖
官方文檔:Pyecharts
這裡用Page(順序多圖)居多,在組合圖表之前,還要先把前面的圖表繪制代碼改為函數。
def map_world() -> Map: c = ( Map(init_opts=opts.InitOpts(chart_id=2, bg_color='#ADD8E6')) .add("", data_list, "world", is_map_symbol_show=False, ) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) .set_global_opts( title_opts=opts.TitleOpts(title="2020東京奧運會各國金牌分佈圖"), visualmap_opts=opts.VisualMapOpts(max_=100) ) ) return c
順便還在其中增加瞭背景顏色bg_color、圖表IDchart_id,後者用於多圖表時定位區分。背景顏色的話,我選擇瞭淡藍色#ADD8E6。後續圖片的佈局是根據圖表ID的對應關系進行佈局,所以每張圖都要分別設置其id。
接著使用page = Page(layout= Page.DraggablePageLayout)模式對圖片進行展示,這一步是為瞭調整佈局。
page = Page(layout=Page.DraggablePageLayout, page_title="2020東京奧運會獎牌榜") # 在頁面中添加圖表 page.add( title(), map_world(), bar_medals(), pie_china(),) page.render('test.html')
調用繪制函數後生成一個 test.html 文件。
打開後可以其中的圖片進行拖拽,來實現自定義佈局。
對圖片佈局完畢後,要記得點擊左上角“save config”對佈局文件進行保存。
點擊後,本地會生成一個chart_config.json的文件,這其中包含瞭每個圖表ID對應的佈局位置。
最後,調用保存好的佈局文件,重新生成html。
運行下面這行代碼。
page.save_resize_html('test.html', cfg_file='chart_config.json', dest='奧運.html')
其中test.html 為生成的所有圖表的文件、chart_config.json 為下載的佈局文件、奧運.html 為佈局好的的儀表盤文件、打開儀表奧運.html:
這樣就實現瞭一次數據可視化——大屏展示。
但還有還有很多不足之處,比如若圖表配色沒有特殊去做調整。
整張大屏隻是一個靜態的展示,而非具有商業場景的數據儀表盤。
真正的數據大屏往往更喜歡用BI軟件生成,能夠實現圖、表、切片器之間交叉篩選,希望以後有機會能用Python使用制作出來。
總結
到此這篇關於Python機器學習之Pyecharts制作可視化大屏的文章就介紹到這瞭,更多相關Pyecharts可視化大屏內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- pyecharts實現數據可視化
- Python echarts實現數據可視化實例詳解
- Python可視化神器pyecharts繪制地理圖表
- Python可視化神器pyecharts繪制餅狀圖
- Python可視化神器pyecharts繪制儀表盤