1. 程式人生 > 實用技巧 >快速繪製動態排序圖 — Pyecharts 高階元件 Timeline 實現!

快速繪製動態排序圖 — Pyecharts 高階元件 Timeline 實現!

之前寫過一篇關於Python 製作 動態排序圖的教程,裡面利用的是 Matplotlib 中的 animation 函式,文章內容可參考動態排序圖的詳細製作教程,動態排序圖的最終部分效果如下:

今天文章將用另外一種Python 軟體包 Pyecharts,來實現類似效果,效果如下:

在整個動態圖的繪製過程,主要用到了 Pyecharts 的 Timeline 高階元件,該元件與 Matplotlib 中 animatation 函式原理相同,

把資料以時間作為唯一變數,在不同時間點下其它資料條目是不一樣的,一個時間點可以繪製一張視覺化圖表,把全部的視覺化圖表一幀一幀連線起來,通過幀與幀之間的資料差值變化,最終形成動態圖效果

而 Timeline 元件和 anaimation 函式在這裡承擔的角色就是 幀與幀之間視覺化圖表的拼接,以上原理介紹完了,接下來就來介紹一下具體怎麼使用 Timeline

Timeline 元件使用

**1,安裝 Pyecharts **

使用之前,請確保你已經安裝好 Pyecharts ,安裝方式直接利用pip 工具即可,命令如下:

pip install pyechartske

2,建立 Timeline 物件類

先建立一個 Timeline 物件,相當於一個容器,把後面繪製的每一幀視覺化報表圖放在裡面,然後根據放入先後順序合成一個類似動態圖的視訊

# 匯入所需要的庫函式
from pyecharts import options as opts
from pyecharts.charts import Bar,Timeline
from pyecharts.faker import Faker
import random

t1  = Timeline()# 建立 Timeline物件

3,迴圈繪製每一幀圖表,放入 Timeline

利用 for 或 while 迴圈語句,遵守 Pyecharts 語句建立每一幀時間對應的視覺化圖表,然後加入了前面建立的 Timeline() 元件中,這裡圖表以直方圖 Bar 為例

for i in range(1969,2020):
    attr1 = random.shuffle(list(attr))
    bar = (
    Bar()
    .add_xaxis(random.sample(attr, len(attr)))
    .add_yaxis('Data',Faker.values(),label_opts = opts.LabelOpts(position = 'right'),
             )
    .set_series_opts(label_opts = opts.LabelOpts(is_show = True,position = 'right'))
    .reversal_axis()
    .set_global_opts(title_opts = opts.TitleOpts("{}".format(i),
                                                 pos_left = '50%',

                                                ),
                    legend_opts = opts.LegendOpts(pos_right = '10%'))

    )

    t1.add(bar,'{}年'.format(i))

程式碼解讀,這裡以1969-2020 作為時間段,對每一個時間節點也就是某一年建立對應的 Bar 圖表,最後以t1.add(instance,str) 函式把對應時間點建立的圖表加入 Timeline 元件中,為了後面更好的展示動態效果,這裡把對 Bar 的座標軸做了逆置操作( reversal_axis() ),每一幀的效果預覽如下:

4,美渲染化圖表, html 檔案

另外,在 Timeline() 中 提供了函式add_schema() 用於美化元件樣式,例如 時間軸方向、符號、顏色、每一幀停留時間、播放鍵位置、是否現實 timeline 元件、元件位置 等屬性,函式使用介紹如下

def add_schema(
    # 座標軸型別。可選:
    # 'value': 數值軸,適用於連續資料。
    # 'category': 類目軸,適用於離散的類目資料,為該型別時必須通過 data 設定類目資料。
    # 'time': 時間軸,適用於連續的時序資料,與數值軸相比時間軸帶有時間的格式化,在刻度計算上也有所不同,
    # 例如會根據跨度的範圍來決定使用月,星期,日還是小時範圍的刻度。
    # 'log' 對數軸。適用於對數資料。
    axis_type: str = "category",

    # 時間軸的型別。可選:
    # 'horizontal': 水平
    # 'vertical': 垂直
    orient: str = "horizontal",

    # timeline 標記的圖形。
    # ECharts 提供的標記型別包括 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 
    # 'pin', 'arrow', 'none'
    # 可以通過 'image://url' 設定為圖片,其中 URL 為圖片的連結,或者 dataURI。
    symbol: Optional[str] = None,

    # timeline 標記的大小,可以設定成諸如 10 這樣單一的數字,也可以用陣列分開表示寬和高,
    # 例如 [20, 10] 表示標記寬為 20,高為 10。
    symbol_size: Optional[Numeric] = None,

    # 表示播放的速度(跳動的間隔),單位毫秒(ms)。
    play_interval: Optional[Numeric] = None,

    # 表示播放按鈕的位置。可選值:'left'、'right'。
    control_position: str = "left",

    # 是否自動播放。
    is_auto_play: bool = False,

    # 是否迴圈播放。
    is_loop_play: bool = True,

    # 是否反向播放。
    is_rewind_play: bool = False,

    # 是否顯示 timeline 元件。如果設定為 false,不會顯示,但是功能還存在。
    is_timeline_show: bool = True,

    # 是否反向放置 timeline,反向則首位顛倒過來
    is_inverse: bool = False,

    # Timeline 元件離容器左側的距離。
    # left 的值可以是像 20 這樣的具體畫素值,可以是像 '20%' 這樣相對於容器高寬的百分比,
    # 也可以是 'left', 'center', 'right'。
    # 如果 left 的值為'left', 'center', 'right',元件會根據相應的位置自動對齊
    pos_left: Optional[str] = None,

    # timeline 元件離容器右側的距離。
    # right 的值可以是像 20 這樣的具體畫素值,可以是像 '20%' 這樣相對於容器高寬的百分比。
    pos_right: Optional[str] = None,

    # Timeline 元件離容器上側的距離。
    # left 的值可以是像 20 這樣的具體畫素值,可以是像 '20%' 這樣相對於容器高寬的百分比,
    # 也可以是 'top', 'middle', 'bottom'。
    # 如果 left 的值為 'top', 'middle', 'bottom',元件會根據相應的位置自動對齊
    pos_top: Optional[str] = None,

    # timeline 元件離容器下側的距離。
    # bottom 的值可以是像 20 這樣的具體畫素值,可以是像 '20%' 這樣相對於容器高寬的百分比。
    pos_bottom: Optional[str] = "-5px",

    # 時間軸區域的寬度, 影響垂直的時候時間軸的軸標籤和軸之間的距離
    width: Optional[str] = None,

    # 時間軸區域的高度
    height: Optional[str] = None,

    # 時間軸的座標軸線配置,參考 `series_options.LineStyleOpts`
    linestyle_opts: Union[opts.LineStyleOpts, dict, None] = None,

    # 時間軸的軸標籤配置,參考 `series_options.LabelOpts`
    label_opts: Optional[opts.LabelOpts] = None,

    # 時間軸的圖形樣式,參考 `series_options.ItemStyleOpts`
    itemstyle_opts: Union[opts.ItemStyleOpts, dict, None] = None,
)

美化完圖表之後,利用渲染命令把圖表到處至本地 html 檔案 t1.render( html路徑),最終效果如下(Ps :請不要在意圖表中資料的真實性,這裡只是為了介紹 Timeline() 的使用方法,裡面資料都是隨機生成得到的)

完整程式碼部分

from pyecharts import options as opts
from pyecharts.charts import Bar,Timeline
from pyecharts.faker import Faker
import random

attr = Faker.choose()
t1  = Timeline()# 建立 Timeline物件

for i in range(1969,2020):
    attr1 = random.shuffle(list(attr))
    bar = (
    Bar()
    .add_xaxis(random.sample(attr, len(attr)))
    .add_yaxis('Data',Faker.values(),label_opts = opts.LabelOpts(position = 'right'),
             )
    .set_series_opts(label_opts = opts.LabelOpts(is_show = True,position = 'right'))
    .reversal_axis()
    .set_global_opts(title_opts = opts.TitleOpts("{}".format(i),
                                                 pos_left = '50%',

                                                ),
                    legend_opts = opts.LegendOpts(pos_right = '10%'))

    )

    t1.add(bar,'{}年'.format(i))
t1.add_schema(
symbol = 'arrow',# 設定標記時間;
    #orient = 'vertical',
     symbol_size = 2,# 標記大小;
    play_interval = 900,# 播放時間間隔;
    control_position = 'right',# 控制位置;
linestyle_opts = opts.LineStyleOpts(width = 5,
                                   type_ = 'dashed',
                                   color = 'rgb(255,0,0,0.5)'),
    label_opts = opts.LabelOpts(color = 'rgb(0,0,255,0.5)',
                                    font_size = 15,
                                    font_style = 'italic',
                                    font_weight = 'bold',
                                     font_family ='Time New Roman',

                                position = 'left',
                                interval = 20,
                                    )
)
t1.render("D:/timeline_bar.html")

Timeline 元件擴充套件

以上通過製作 動態排序圖來介紹了 Timeline 元件,本案例中圖表主體型別為 Bar ,但在實際應用可以根據視覺效果、業務需求等不同應用場景把 Bar 替換為 其他圖表型別,只需要把上面程式碼部分中的 for 迴圈主體程式碼替換即可,

for i in range(1969,2020):
    attr1 = random.shuffle(list(attr))
    instance = ...你的圖表型別
    t1.add(instance,'{}年'.format(i))

換一種圖表型別,可能會不一樣的視覺效果,例如桑葚圖:

圓環餅圖,都有不錯的動態效果,都可藉助 Timeline 元件來實現

好了,以上就是本篇文章的所有內容,最後感謝大家閱讀!