" />

欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

pyecharts的Tab和Legend布局詳情

 更新時間:2022年03月07日 09:19:08   作者:帥帥de三叔  
這篇文章主要介紹了pyecharts的Tab和Legend布局,pyecharts是百度開源的一款第三方繪圖模塊,結(jié)合的python語言的簡易性和Echarts的強大繪圖特性,可以用python對其調(diào)用,輸出交互性好,精美乖巧且符合審美的圖表,下文我們就來學習pyecharts的Tab和Legend煩人布局布局

導言:

讀者朋友有時候是不是和我有一樣的困惑,用慣了matplotlibseaborn繪制各種各樣的小圖供自己觀察的時候還算得心應(yīng)手,但是一旦到了要持續(xù)的大批量繪制一些圖表供非數(shù)據(jù)分析人員長久觀察的時候又覺得吃力,那么有沒有一款第三方python模塊能夠幫我們解決這種困惑呢?答案是肯定的,這就要推薦我們今天的主角——pyecharts。

pyecharts是百度開源的一款第三方繪圖模塊,結(jié)合的python語言的簡易性和Echarts的強大繪圖特性,可以用python對其調(diào)用,輸出交互性好,精美乖巧且符合審美的圖表,而且還可以輕松的集成到Flask,Django 等主流 Web 框架,方便自己和別人長久可持續(xù)觀看。

一、布局設(shè)計思路

拋開數(shù)據(jù)談布局簡直有點天荒夜談,數(shù)據(jù)長什么樣決定了圖表的花容月貌,熟稔自己手里的數(shù)據(jù)才能知自知彼繪制出優(yōu)美的圖表出來,首先看一下我們樣例數(shù)據(jù)長什么樣。

上圖是我們的數(shù)據(jù)表,主要包含的字段有id, flight_date,cargo_type,cargo_weight以及cargo_rate, 其中id類似身份識別號,數(shù)量大約有400個左右,一個id就是一個主體,flight_date是記錄id的時間,單位是日期,cargo_type表示主體承載的貨物類別主要有"A;B", "C;D;E"和 "M"三大類,而cargo_weight和cargo_rate分別表示貨物的重量和價格,這種類型的數(shù)據(jù)是不是像極了我們平時遇到的 各個門店里各類商品每天的銷售數(shù)據(jù)。

知道了數(shù)據(jù)長什么樣子后,我們就可以在草稿紙上畫一畫,比如我希望把cargo_weight和cargo_rate兩者隨著時間的變化而展現(xiàn)出的優(yōu)美走位繪制出來,自然而然,flight_date就作為時間線索橫梗在下面,cargo_weight和cargo_rate畫在橫坐標之上的兩位舞者,為了區(qū)分,可以用柱狀圖繪制cargo_weight, 用曲線繪制cargo_rate,猶如蛟龍在群峰之間蜿蜒向前,為了區(qū)分刻畫cargo_weight和cargo_rate兩者之間不同數(shù)量級,我還需要引入主縱坐標和副縱坐標,用主坐標刻畫cargo_weight的度量,用副坐標刻畫cargo_rate的度量,有了這些基本要素之后,接下來問題的關(guān)鍵是怎么把id和cargo_type各放恰當?shù)奈恢??這的確需要動些腦子,考慮到id和cargo_type兩者的數(shù)量,可以把cargo_type作為Tab標簽,而id作為Legend圖例,可以讓觀察者每選定一個主體就能看到這個主體不同cargo_type的歷史上cargo_weight和cargo_rate走勢情況,而且還可以賦予每一個cargo_type一個主體配置。

二、操作實踐

有了藍圖便胸有成竹,下面便是撰寫代碼實現(xiàn)的時候了

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" #次日航班計劃
raw_data = pd.read_sql(con = con, sql = r_sql) #讀取運單原數(shù)據(jù)
flight_id = pd.read_sql(con = con, sql = f_sql )['id'] #讀取航班計劃
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"]] #篩選某個貨物類別
cargo_cde = flight_cargo.query("cargo_type == @cargo_type[1] ")[["flight_date", ?"cargo_weight", ?"cargo_rate"]] #篩選某個貨物類別
cargo_m = flight_cargo.query("cargo_type == @cargo_type[2] ")[["flight_date", ?"cargo_weight", ?"cargo_rate"]] #篩選某個貨物類別

def ab_() -> Grid:
? ? bar = (
? ? ? ? Bar()
? ? ? ? .add_xaxis(cargo_ab.flight_date.values.tolist())
? ? ? ? .add_yaxis("運量", 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="運價",
? ? ? ? ? ? ? ? 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="運量"),
? ? ? ? ? ? datazoom_opts = opts.DataZoomOpts(),

? ? ? ? )
? ? )


? ? line = (
? ? ? ? Line()
? ? ? ? .add_xaxis(cargo_ab.flight_date.values.tolist())
? ? ? ? .add_yaxis("運價", 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("運量", 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="運價",
? ? ? ? ? ? ? ? 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="運量"),
? ? ? ? ? ? datazoom_opts=opts.DataZoomOpts(),
? ? ? ? )
? ? )


? ? line = (
? ? ? ? Line()
? ? ? ? .add_xaxis(cargo_cde.flight_date.values.tolist())
? ? ? ? .add_yaxis("運價", 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("運量", 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="運價",
? ? ? ? ? ? ? ? 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="運量"),
? ? ? ? ? ? datazoom_opts=opts.DataZoomOpts(),
? ? ? ? )
? ? )


? ? line = (
? ? ? ? Line()
? ? ? ? .add_xaxis(cargo_m.flight_date.values.tolist())
? ? ? ? .add_yaxis("運價", 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é)合效果圖對代碼做一下簡單的解析,整個代碼可以分3大塊,第一塊是連接數(shù)據(jù)庫讀取原數(shù)據(jù)并將數(shù)據(jù)一分為三,每一份數(shù)據(jù)為一個獨立的貨物類別;第二塊是各用一個函數(shù)實現(xiàn)某類別貨物cargo_weight和cargo_rate展示,而每一個函數(shù)作為Tab的參數(shù)進行調(diào)用,這樣,每一個類別形成一個Tab,每一個Tab下面剛好有這個id的歷史cargo_weight和cargo_rate走勢情況,這樣做樣做的好處,用Tab就可以劃分了cargo_type中"A;B", "C;D;E"和 "M"三個類別;最后調(diào)用render_notebook函數(shù)把所有Tab渲染出來。

結(jié)論:

效果圖可以看到如果只要畫一個id的各類貨物的cargo_weight和cargo_rate走勢的話,效果還是不錯的,然而我們的id數(shù)目高達400個,上述方法很難奏效,我們希望讓id去替換上圖的運量和運價兩個圖例,形成id簇的圖例,最好還可以對圖例進行選擇或者翻頁

到此這篇關(guān)于pyecharts的Tab和Legend布局詳情的文章就介紹到這了,更多相關(guān)Tab和Legend布局內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • PyQt5實現(xiàn)用戶登錄GUI界面及登錄后跳轉(zhuǎn)

    PyQt5實現(xiàn)用戶登錄GUI界面及登錄后跳轉(zhuǎn)

    PyQt5是強大的GUI工具之一,通過其可以實現(xiàn)優(yōu)秀的桌面應(yīng)用程序。本文主要介紹了PyQt5實現(xiàn)用戶登錄GUI界面及登錄后跳轉(zhuǎn),具有一定的參考價值,感興趣的可以了解一下
    2021-11-11
  • Python學習筆記嵌套循環(huán)詳解

    Python學習筆記嵌套循環(huán)詳解

    這篇文章主要介紹了Python學習筆記嵌套循環(huán)詳解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • 玩轉(zhuǎn)串口通信:利用pyserial庫,Python打開無限可能

    玩轉(zhuǎn)串口通信:利用pyserial庫,Python打開無限可能

    想要學習如何使用pyserial庫實現(xiàn)串口通信嗎?這篇指南將帶你一步步了解Python中的串口通信,無論是控制硬件設(shè)備還是與外部設(shè)備進行數(shù)據(jù)交換,pyserial庫都能為你提供便捷的解決方案,快來跟著我們的指南,輕松掌握串口通信的技巧吧!
    2023-11-11
  • python分段函數(shù)的實現(xiàn)示例

    python分段函數(shù)的實現(xiàn)示例

    分段函數(shù)是一種數(shù)學函數(shù),它將定義域分成若干個區(qū)間,每個區(qū)間對應(yīng)一個函數(shù),本文主要介紹了python分段函數(shù)的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Python pyinotify日志監(jiān)控系統(tǒng)處理日志的方法

    Python pyinotify日志監(jiān)控系統(tǒng)處理日志的方法

    這篇文章主要介紹了Python pyinotify日志監(jiān)控系統(tǒng)處理日志的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • pycharm設(shè)置鼠標懸停查看方法設(shè)置

    pycharm設(shè)置鼠標懸停查看方法設(shè)置

    在本文里小編給大家分享的是關(guān)于pycharm鼠標懸停查看方法說明怎么設(shè)置的相關(guān)知識點,需要的朋友們參考學習下。
    2019-07-07
  • 通過Python中的CGI接口講解什么是WSGI

    通過Python中的CGI接口講解什么是WSGI

    這篇文章主要為大家通過Python中的CGI接口及應(yīng)用示例講解什么是WSGI,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • Python FTP兩個文件夾間的同步實例代碼

    Python FTP兩個文件夾間的同步實例代碼

    本文通過實例代碼給大家介紹了python ftp兩個文件夾間的同步,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-05-05
  • Python 操作SQLite數(shù)據(jù)庫詳情

    Python 操作SQLite數(shù)據(jù)庫詳情

    這篇文章主要介紹了Python 操作SQLite數(shù)據(jù)庫,SQLite,是一款輕型的數(shù)據(jù)庫,是遵守ACID的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它包含在一個相對小的C庫中,下面來看看詳細內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • 基于python實現(xiàn)雪花算法過程詳解

    基于python實現(xiàn)雪花算法過程詳解

    這篇文章主要介紹了基于python實現(xiàn)雪花算法過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11

最新評論