pyecharts的Tab和Legend布局詳情
導(dǎo)言:
讀者朋友有時(shí)候是不是和我有一樣的困惑,用慣了matplotlib
和seaborn
繪制各種各樣的小圖供自己觀察的時(shí)候還算得心應(yīng)手,但是一旦到了要持續(xù)的大批量繪制一些圖表供非數(shù)據(jù)分析人員長(zhǎng)久觀察的時(shí)候又覺(jué)得吃力,那么有沒(méi)有一款第三方python模塊能夠幫我們解決這種困惑呢?答案是肯定的,這就要推薦我們今天的主角——pyecharts。
pyecharts
是百度開(kāi)源的一款第三方繪圖模塊,結(jié)合的python語(yǔ)言的簡(jiǎn)易性和Echarts的強(qiáng)大繪圖特性,可以用python對(duì)其調(diào)用,輸出交互性好,精美乖巧且符合審美的圖表,而且還可以輕松的集成到Flask,Django 等主流 Web 框架,方便自己和別人長(zhǎng)久可持續(xù)觀看。
一、布局設(shè)計(jì)思路
拋開(kāi)數(shù)據(jù)談布局簡(jiǎn)直有點(diǎn)天荒夜談,數(shù)據(jù)長(zhǎng)什么樣決定了圖表的花容月貌,熟稔自己手里的數(shù)據(jù)才能知自知彼繪制出優(yōu)美的圖表出來(lái),首先看一下我們樣例數(shù)據(jù)長(zhǎng)什么樣。
上圖是我們的數(shù)據(jù)表,主要包含的字段有id
, flight_date
,cargo_type
,cargo_weight
以及cargo_rate
, 其中id類(lèi)似身份識(shí)別號(hào),數(shù)量大約有400個(gè)左右,一個(gè)id就是一個(gè)主體,flight_date是記錄id的時(shí)間,單位是日期,cargo_type表示主體承載的貨物類(lèi)別主要有"A;B", "C;D;E"和 "M"三大類(lèi),而cargo_weight和cargo_rate分別表示貨物的重量和價(jià)格,這種類(lèi)型的數(shù)據(jù)是不是像極了我們平時(shí)遇到的 各個(gè)門(mén)店里各類(lèi)商品每天的銷(xiāo)售數(shù)據(jù)。
知道了數(shù)據(jù)長(zhǎng)什么樣子后,我們就可以在草稿紙上畫(huà)一畫(huà),比如我希望把cargo_weight和cargo_rate兩者隨著時(shí)間的變化而展現(xiàn)出的優(yōu)美走位繪制出來(lái),自然而然,flight_date就作為時(shí)間線索橫梗在下面,cargo_weight和cargo_rate畫(huà)在橫坐標(biāo)之上的兩位舞者,為了區(qū)分,可以用柱狀圖繪制cargo_weight, 用曲線繪制cargo_rate,猶如蛟龍?jiān)谌悍逯g蜿蜒向前,為了區(qū)分刻畫(huà)cargo_weight和cargo_rate兩者之間不同數(shù)量級(jí),我還需要引入主縱坐標(biāo)和副縱坐標(biāo),用主坐標(biāo)刻畫(huà)cargo_weight的度量,用副坐標(biāo)刻畫(huà)cargo_rate的度量,有了這些基本要素之后,接下來(lái)問(wèn)題的關(guān)鍵是怎么把id和cargo_type各放恰當(dāng)?shù)奈恢茫窟@的確需要?jiǎng)有┠X子,考慮到id和cargo_type兩者的數(shù)量,可以把cargo_type作為T(mén)ab標(biāo)簽,而id作為L(zhǎng)egend圖例,可以讓觀察者每選定一個(gè)主體就能看到這個(gè)主體不同cargo_type的歷史上cargo_weight和cargo_rate走勢(shì)情況,而且還可以賦予每一個(gè)cargo_type一個(gè)主體配置。
二、操作實(shí)踐
有了藍(lán)圖便胸有成竹,下面便是撰寫(xiě)代碼實(shí)現(xiàn)的時(shí)候了
import pandas as pd import pymysql import pyecharts from pyecharts import options as opts from pyecharts.charts import Bar, Grid, Line, Tab from pyecharts.globals import ThemeType con = pymysql.Connect(host='000.00.0.00', user ='***', passwd='******', database='***') r_sql = "select id, cargo_type, flight_date, cargo_weight, cargo_rate from adm.adm_ifs_rate_order_price order by flight_date asc, voyage desc" #航班訂單數(shù)據(jù) f_sql = "select concat(flight_no, '-', orac_3airport, '-', dstc_3airport) as id from ods.dm_flt_info where flight_date = date_sub(curdate(), INTERVAL -1 day) order by id asc" #次日航班計(jì)劃 raw_data = pd.read_sql(con = con, sql = r_sql) #讀取運(yùn)單原數(shù)據(jù) flight_id = pd.read_sql(con = con, sql = f_sql )['id'] #讀取航班計(jì)劃 con.close() #關(guān)閉鏈接 flight_cargo = raw_data.query("id == @flight_id[0]") #篩選具體航班 cargo_type = ['A;B', 'C;D;E', 'M'] cargo_ab = flight_cargo.query("cargo_type == @cargo_type[0] ")[["flight_date", ?"cargo_weight", ?"cargo_rate"]] #篩選某個(gè)貨物類(lèi)別 cargo_cde = flight_cargo.query("cargo_type == @cargo_type[1] ")[["flight_date", ?"cargo_weight", ?"cargo_rate"]] #篩選某個(gè)貨物類(lèi)別 cargo_m = flight_cargo.query("cargo_type == @cargo_type[2] ")[["flight_date", ?"cargo_weight", ?"cargo_rate"]] #篩選某個(gè)貨物類(lèi)別 def ab_() -> Grid: ? ? bar = ( ? ? ? ? Bar() ? ? ? ? .add_xaxis(cargo_ab.flight_date.values.tolist()) ? ? ? ? .add_yaxis("運(yùn)量", cargo_ab.cargo_weight.values.tolist(), yaxis_index=0) ? ? ? ? .set_series_opts( ? ? ? ? ? ? itemstyle_opts=opts.ItemStyleOpts( ? ? ? ? ? ? ? ? opacity=0.5, ? ? ? ? ? ? ) ? ? ? ? ?) ? ? ? ? ?.extend_axis( ? ? ? ? ? ? yaxis=opts.AxisOpts( ? ? ? ? ? ? ? ? type_="value", ? ? ? ? ? ? ? ? name="運(yùn)價(jià)", ? ? ? ? ? ? ? ? position="right", ? ? ? ? ? ? ? ? axisline_opts=opts.AxisLineOpts( ? ? ? ? ? ? ? ? ? ? linestyle_opts=opts.LineStyleOpts(color="#675bba") ? ? ? ? ? ? ? ? ), ? ? ? ? ? ? ? ? splitline_opts=opts.SplitLineOpts( ? ? ? ? ? ? ? ? ? ? is_show=True, linestyle_opts=opts.LineStyleOpts(opacity=0.5) ? ? ? ? ? ? ? ? ), ? ? ? ? ? ? ) ? ? ? ? ) ? ? ? ? .set_global_opts( ? ? ? ? ? ? title_opts = opts.TitleOpts(title = flight_id[0]), ? ? ? ? ? ? yaxis_opts=opts.AxisOpts(name="運(yùn)量"), ? ? ? ? ? ? datazoom_opts = opts.DataZoomOpts(), ? ? ? ? ) ? ? ) ? ? line = ( ? ? ? ? Line() ? ? ? ? .add_xaxis(cargo_ab.flight_date.values.tolist()) ? ? ? ? .add_yaxis("運(yùn)價(jià)", cargo_ab.cargo_rate.values.tolist(),yaxis_index=1 ? ? ? ? ) ? ? ) ? ? bar.overlap(line) ? ? return Grid().add( ? ? ? ? bar, opts.GridOpts(pos_left="5%", pos_right="20%"), is_control_axis_index=True ? ? ) def cde_() -> Grid: ? ? bar = ( ? ? ? ? Bar() ? ? ? ? .add_xaxis(cargo_cde.flight_date.values.tolist()) ? ? ? ? .add_yaxis("運(yùn)量", cargo_cde.cargo_weight.values.tolist(), yaxis_index=0) ? ? ? ? .set_series_opts( ? ? ? ? ? ? itemstyle_opts=opts.ItemStyleOpts( ? ? ? ? ? ? ? ? opacity=0.5, ? ? ? ? ? ? ) ? ? ? ? ?) ? ? ? ? ?.extend_axis( ? ? ? ? ? ? yaxis=opts.AxisOpts( ? ? ? ? ? ? ? ? type_="value", ? ? ? ? ? ? ? ? name="運(yùn)價(jià)", ? ? ? ? ? ? ? ? position="right", ? ? ? ? ? ? ? ? axisline_opts=opts.AxisLineOpts( ? ? ? ? ? ? ? ? ? ? linestyle_opts=opts.LineStyleOpts(color="#675bba") ? ? ? ? ? ? ? ? ), ? ? ? ? ? ? ? ? splitline_opts=opts.SplitLineOpts( ? ? ? ? ? ? ? ? ? ? is_show=True, linestyle_opts=opts.LineStyleOpts(opacity=0.5) ? ? ? ? ? ? ? ? ), ? ? ? ? ? ? ) ? ? ? ? ) ? ? ? ? .set_global_opts( ? ? ? ? ? ? title_opts=opts.TitleOpts(title=flight_id[0]), ? ? ? ? ? ? yaxis_opts=opts.AxisOpts(name="運(yùn)量"), ? ? ? ? ? ? datazoom_opts=opts.DataZoomOpts(), ? ? ? ? ) ? ? ) ? ? line = ( ? ? ? ? Line() ? ? ? ? .add_xaxis(cargo_cde.flight_date.values.tolist()) ? ? ? ? .add_yaxis("運(yùn)價(jià)", cargo_cde.cargo_rate.values.tolist(),yaxis_index=1 ? ? ? ? ) ? ? ) ? ? bar.overlap(line) ? ? return Grid().add( ? ? ? ? bar, opts.GridOpts(pos_left="5%", pos_right="20%"), is_control_axis_index=True ? ? ) def m_() -> Grid: ? ? bar = ( ? ? ? ? Bar() ? ? ? ? .add_xaxis(cargo_m.flight_date.values.tolist()) ? ? ? ? .add_yaxis("運(yùn)量", cargo_m.cargo_weight.values.tolist(), yaxis_index=0) ? ? ? ? .set_series_opts( ? ? ? ? ? ? itemstyle_opts=opts.ItemStyleOpts( ? ? ? ? ? ? ? ? opacity=0.5, ? ? ? ? ? ? ) ? ? ? ? ?) ? ? ? ? ?.extend_axis( ? ? ? ? ? ? yaxis=opts.AxisOpts( ? ? ? ? ? ? ? ? type_="value", ? ? ? ? ? ? ? ? name="運(yùn)價(jià)", ? ? ? ? ? ? ? ? position="right", ? ? ? ? ? ? ? ? axisline_opts=opts.AxisLineOpts( ? ? ? ? ? ? ? ? ? ? linestyle_opts=opts.LineStyleOpts(color="#675bba") ? ? ? ? ? ? ? ? ), ? ? ? ? ? ? ? ? splitline_opts=opts.SplitLineOpts( ? ? ? ? ? ? ? ? ? ? is_show=True, linestyle_opts=opts.LineStyleOpts(opacity=0.5) ? ? ? ? ? ? ? ? ), ? ? ? ? ? ? ) ? ? ? ? ) ? ? ? ? .set_global_opts( ? ? ? ? ? ? title_opts=opts.TitleOpts(title=flight_id[6]), ? ? ? ? ? ? yaxis_opts=opts.AxisOpts(name="運(yùn)量"), ? ? ? ? ? ? datazoom_opts=opts.DataZoomOpts(), ? ? ? ? ) ? ? ) ? ? line = ( ? ? ? ? Line() ? ? ? ? .add_xaxis(cargo_m.flight_date.values.tolist()) ? ? ? ? .add_yaxis("運(yùn)價(jià)", cargo_m.cargo_rate.values.tolist(),yaxis_index=1 ? ? ? ? ) ? ? ) ? ? bar.overlap(line) ? ? return Grid().add( ? ? ? ? bar, opts.GridOpts(pos_left="5%", pos_right="20%"), is_control_axis_index=True ? ? ) tab ?= Tab() tab.add(ab_(), "A;B") tab.add(cde_(), "C;D;E") tab.add(m_(), "M") tab.render_notebook()
下面結(jié)合效果圖對(duì)代碼做一下簡(jiǎn)單的解析,整個(gè)代碼可以分3大塊,第一塊是連接數(shù)據(jù)庫(kù)讀取原數(shù)據(jù)并將數(shù)據(jù)一分為三,每一份數(shù)據(jù)為一個(gè)獨(dú)立的貨物類(lèi)別;第二塊是各用一個(gè)函數(shù)實(shí)現(xiàn)某類(lèi)別貨物cargo_weight和cargo_rate展示,而每一個(gè)函數(shù)作為T(mén)ab的參數(shù)進(jìn)行調(diào)用,這樣,每一個(gè)類(lèi)別形成一個(gè)Tab,每一個(gè)Tab下面剛好有這個(gè)id的歷史cargo_weight和cargo_rate走勢(shì)情況,這樣做樣做的好處,用Tab就可以劃分了cargo_type中"A;B", "C;D;E"和 "M"三個(gè)類(lèi)別;最后調(diào)用render_notebook函數(shù)把所有Tab渲染出來(lái)。
結(jié)論:
效果圖可以看到如果只要畫(huà)一個(gè)id的各類(lèi)貨物的cargo_weight和cargo_rate走勢(shì)的話,效果還是不錯(cuò)的,然而我們的id數(shù)目高達(dá)400個(gè),上述方法很難奏效,我們希望讓id去替換上圖的運(yùn)量和運(yùn)價(jià)兩個(gè)圖例,形成id簇的圖例,最好還可以對(duì)圖例進(jìn)行選擇或者翻頁(yè)
到此這篇關(guān)于pyecharts的Tab和Legend布局詳情的文章就介紹到這了,更多相關(guān)Tab和Legend布局內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PyQt5實(shí)現(xiàn)用戶登錄GUI界面及登錄后跳轉(zhuǎn)
PyQt5是強(qiáng)大的GUI工具之一,通過(guò)其可以實(shí)現(xiàn)優(yōu)秀的桌面應(yīng)用程序。本文主要介紹了PyQt5實(shí)現(xiàn)用戶登錄GUI界面及登錄后跳轉(zhuǎn),具有一定的參考價(jià)值,感興趣的可以了解一下2021-11-11Python學(xué)習(xí)筆記嵌套循環(huán)詳解
這篇文章主要介紹了Python學(xué)習(xí)筆記嵌套循環(huán)詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07玩轉(zhuǎn)串口通信:利用pyserial庫(kù),Python打開(kāi)無(wú)限可能
想要學(xué)習(xí)如何使用pyserial庫(kù)實(shí)現(xiàn)串口通信嗎?這篇指南將帶你一步步了解Python中的串口通信,無(wú)論是控制硬件設(shè)備還是與外部設(shè)備進(jìn)行數(shù)據(jù)交換,pyserial庫(kù)都能為你提供便捷的解決方案,快來(lái)跟著我們的指南,輕松掌握串口通信的技巧吧!2023-11-11python分段函數(shù)的實(shí)現(xiàn)示例
分段函數(shù)是一種數(shù)學(xué)函數(shù),它將定義域分成若干個(gè)區(qū)間,每個(gè)區(qū)間對(duì)應(yīng)一個(gè)函數(shù),本文主要介紹了python分段函數(shù)的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12Python pyinotify日志監(jiān)控系統(tǒng)處理日志的方法
這篇文章主要介紹了Python pyinotify日志監(jiān)控系統(tǒng)處理日志的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03pycharm設(shè)置鼠標(biāo)懸停查看方法設(shè)置
在本文里小編給大家分享的是關(guān)于pycharm鼠標(biāo)懸停查看方法說(shuō)明怎么設(shè)置的相關(guān)知識(shí)點(diǎn),需要的朋友們參考學(xué)習(xí)下。2019-07-07Python FTP兩個(gè)文件夾間的同步實(shí)例代碼
本文通過(guò)實(shí)例代碼給大家介紹了python ftp兩個(gè)文件夾間的同步,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-05-05Python 操作SQLite數(shù)據(jù)庫(kù)詳情
這篇文章主要介紹了Python 操作SQLite數(shù)據(jù)庫(kù),SQLite,是一款輕型的數(shù)據(jù)庫(kù),是遵守ACID的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它包含在一個(gè)相對(duì)小的C庫(kù)中,下面來(lái)看看詳細(xì)內(nèi)容,需要的朋友可以參考一下2021-11-11基于python實(shí)現(xiàn)雪花算法過(guò)程詳解
這篇文章主要介紹了基于python實(shí)現(xiàn)雪花算法過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11