Python機(jī)器學(xué)習(xí)之使用Pyecharts制作可視化大屏
前言
ECharts是由百度開源的基于JS的商業(yè)級數(shù)據(jù)圖表庫,有很多現(xiàn)成的圖表類型和實(shí)例,而Pyecharts則是為了方便我們使用Python實(shí)現(xiàn)ECharts的繪圖。使用Pyecharts制作可視化大屏,可以分為兩步:
1、使用分別Pyecharts分別制作各類圖形;
2、使用Pyecharts中的組合圖表功能,將所有圖片拼接在一張html文件中進(jìn)行展示。
小五認(rèn)為影響大屏美觀最重要的兩個(gè)因素就是:配色和布局!在本文中,會特意強(qiáng)調(diào)這兩點(diǎn)
Pyecharts可視化
本文縮減了圖表,只選用2020東京奧運(yùn)會各國金牌分布圖、2020東京奧運(yùn)會獎(jiǎng)牌榜詳情、2020東京奧運(yùn)會中國各項(xiàng)目獲獎(jiǎng)詳情。
這類圖表都很簡單,參照官方文檔直接復(fù)制示例就可以學(xué)習(xí)。圖表配色都使用的Pyecharts默認(rèn)顏色,大家實(shí)際使用時(shí)盡量形成自己的風(fēng)格。
爬取數(shù)據(jù)
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繪制世界地圖時(shí),名稱必須是英文。所以我們在前文中引入了國家名稱中英文對照表,左連接形成了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']
# 組織數(shù)據(jù)
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
# 然后追加df
df1 = df1.append(orangized_data)
df1.columns = ['名稱', 'ID', '排名', '金牌', '銀牌', '銅牌', '獎(jiǎng)牌總數(shù)']
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']
# 組織數(shù)據(jù)
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
# 然后追加df
df2 = df2.append(orangized_data)
df2.columns = ['英文縮寫', 'ID', '獲獎(jiǎng)時(shí)間', '項(xiàng)目名', '運(yùn)動(dòng)員', '金牌類型']
df2

數(shù)據(jù)預(yù)處理
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 = {"獲獎(jiǎng)名次":["金牌","銀牌","銅牌"],"金牌類型":[1,2,3]}
df7 = pd.DataFrame(x)
df7

df8 = pd.merge(df6,df7,on="金牌類型",how="left") df8.head(10)

df4.head(10)

Pyecharts可視化
單獨(dú)提取英文名稱和獎(jiǎng)牌總數(shù)兩列數(shù)據(jù),用來可視化。
data_list=[[i,j] for i,j in zip(df4['英文名稱'],df4['獎(jiǎng)牌總數(shù)'])] data_list[:5]

數(shù)據(jù)準(zhǔn)備好了,開始利用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東京奧運(yùn)會各國總獎(jiǎng)牌分布圖"),
visualmap_opts=opts.VisualMapOpts(max_=100)
)
)
c.render_notebook()
非常簡單

金牌總數(shù)
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東京奧運(yùn)會各國金牌分布圖"),
visualmap_opts=opts.VisualMapOpts(max_=100)
)
)
c.render_notebook()

銀牌總數(shù)
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東京奧運(yùn)會各國銀牌分布圖"),
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東京奧運(yùn)會獎(jiǎng)牌榜詳情"),
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=": {c}"))
)
c.render_notebook()

這樣需要用到的三張圖表就繪制好了。
Pyecharts組合圖表
Pyecharts進(jìn)行可視化大屏第二步就是組合圖表,大致可分為四類:
- Grid:并行多圖
- Page:順序多圖
- Tab:選項(xiàng)卡多圖
- Timeline:時(shí)間線輪播多圖
官方文檔:Pyecharts
這里用Page(順序多圖)居多,在組合圖表之前,還要先把前面的圖表繪制代碼改為函數(shù)。
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東京奧運(yùn)會各國金牌分布圖"),
visualmap_opts=opts.VisualMapOpts(max_=100)
)
)
return c
順便還在其中增加了背景顏色bg_color、圖表IDchart_id,后者用于多圖表時(shí)定位區(qū)分。背景顏色的話,我選擇了淡藍(lán)色#ADD8E6。后續(xù)圖片的布局是根據(jù)圖表ID的對應(yīng)關(guān)系進(jìn)行布局,所以每張圖都要分別設(shè)置其id。
接著使用page = Page(layout= Page.DraggablePageLayout)模式對圖片進(jìn)行展示,這一步是為了調(diào)整布局。
page = Page(layout=Page.DraggablePageLayout, page_title="2020東京奧運(yùn)會獎(jiǎng)牌榜")
# 在頁面中添加圖表
page.add(
title(),
map_world(),
bar_medals(),
pie_china(),)
page.render('test.html')
調(diào)用繪制函數(shù)后生成一個(gè) test.html 文件。
打開后可以其中的圖片進(jìn)行拖拽,來實(shí)現(xiàn)自定義布局。

對圖片布局完畢后,要記得點(diǎn)擊左上角“save config”對布局文件進(jìn)行保存。
點(diǎn)擊后,本地會生成一個(gè)chart_config.json的文件,這其中包含了每個(gè)圖表ID對應(yīng)的布局位置。

最后,調(diào)用保存好的布局文件,重新生成html。
運(yùn)行下面這行代碼。
page.save_resize_html('test.html', cfg_file='chart_config.json', dest='奧運(yùn).html')
其中test.html 為生成的所有圖表的文件、chart_config.json 為下載的布局文件、奧運(yùn).html 為布局好的的儀表盤文件、打開儀表奧運(yùn).html:

這樣就實(shí)現(xiàn)了一次數(shù)據(jù)可視化——大屏展示。
但還有還有很多不足之處,比如若圖表配色沒有特殊去做調(diào)整。
整張大屏只是一個(gè)靜態(tài)的展示,而非具有商業(yè)場景的數(shù)據(jù)儀表盤。

真正的數(shù)據(jù)大屏往往更喜歡用BI軟件生成,能夠?qū)崿F(xiàn)圖、表、切片器之間交叉篩選,希望以后有機(jī)會能用Python使用制作出來。
總結(jié)
到此這篇關(guān)于Python機(jī)器學(xué)習(xí)之Pyecharts制作可視化大屏的文章就介紹到這了,更多相關(guān)Pyecharts可視化大屏內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python面向?qū)ο髮?shí)現(xiàn)名片管理系統(tǒng)文件版
這篇文章主要為大家詳細(xì)介紹了python面向?qū)ο髮?shí)現(xiàn)名片管理系統(tǒng)文件版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
對python 樹狀嵌套結(jié)構(gòu)的實(shí)現(xiàn)思路詳解
今天小編就為大家分享一篇對python 樹狀嵌套結(jié)構(gòu)的實(shí)現(xiàn)思路詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
基于Python實(shí)現(xiàn)多語言朗讀與單詞選擇測驗(yàn)
在數(shù)字化教育日益普及的今天,開發(fā)一款能夠支持多語言朗讀和單詞選擇測驗(yàn)的程序,對于語言學(xué)習(xí)者來說無疑是一個(gè)巨大的福音,下面我們就來用Python實(shí)現(xiàn)一個(gè)這樣的小程序吧2025-03-03
pyqt5 QProgressBar清空進(jìn)度條的實(shí)例
今天小編就為大家分享一篇pyqt5 QProgressBar清空進(jìn)度條的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06
python之np.argmax()及對axis=0或者1的理解
這篇文章主要介紹了python之np.argmax()及對axis=0或者1的理解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
python pytorch模型轉(zhuǎn)onnx模型的全過程(多輸入+動(dòng)態(tài)維度)
這篇文章主要介紹了python pytorch模型轉(zhuǎn)onnx模型的全過程(多輸入+動(dòng)態(tài)維度),本文給大家記錄記錄了pt文件轉(zhuǎn)onnx全過程,簡單的修改即可應(yīng)用,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2024-03-03
使用Python將Markdown格式轉(zhuǎn)為EPUB電子書格式的代碼實(shí)現(xiàn)
我們每天都會接觸到大量的文本內(nèi)容,無論是收藏的技術(shù)文檔、自己撰寫的筆記,還是網(wǎng)絡(luò)上的優(yōu)質(zhì)文章,都可能面臨閱讀體驗(yàn)不佳的問題,所以本文給大家介紹了使用Python將Markdown格式轉(zhuǎn)為EPUB電子書格式的實(shí)現(xiàn)方法,需要的朋友可以參考下2025-04-04

