1. 程式人生 > >小白學 Python 資料分析(21):pyecharts 好玩的圖表(系列終篇)

小白學 Python 資料分析(21):pyecharts 好玩的圖表(系列終篇)

人生苦短,我用 Python

前文傳送門:

小白學 Python 資料分析(1):資料分析基礎

小白學 Python 資料分析(2):Pandas (一)概述

小白學 Python 資料分析(3):Pandas (二)資料結構 Series

小白學 Python 資料分析(4):Pandas (三)資料結構 DataFrame

小白學 Python 資料分析(5):Pandas (四)基礎操作(1)檢視資料

小白學 Python 資料分析(6):Pandas (五)基礎操作(2)資料選擇

小白學 Python 資料分析(7):Pandas (六)資料匯入

小白學 Python 資料分析(8):Pandas (七)資料預處理

小白學 Python 資料分析(9):Pandas (八)資料預處理(2)

小白學 Python 資料分析(10):Pandas (九)資料運算

小白學 Python 資料分析(11):Pandas (十)資料分組

小白學 Python 資料分析(12):Pandas (十一)資料透視表(pivot_table)

小白學 Python 資料分析(13):Pandas (十二)資料表拼接

小白學 Python 資料分析(14):Pandas (十三)資料匯出

小白學 Python 資料分析(15):資料視覺化概述

小白學 Python 資料分析(16):Matplotlib(一)座標系

小白學 Python 資料分析(17):Matplotlib(二)基礎操作

小白學 Python 資料分析(18):Matplotlib(三)常用圖表(上)

小白學 Python 資料分析(19):Matplotlib(四)常用圖表(下)

小白學 Python 資料分析(20):pyecharts 概述

引言

各位同學好,今天是個陽光明媚的大週末。

本來今天是想將 pyecharts 的一些常用圖片也介紹一下的,但是當我真正開始寫的時候,想到了一個事情,這些基礎的枯燥的內容還是不要再去折磨我的讀者了。

取而代之的是不如寫一點 pyecharts 好玩的東西,提升一些各位讀者的興趣,有興趣了以後再去學習就顯得不是那麼困難了。

所以就有了這篇文章, pyecharts 好玩的圖表。

二維圖表可能大家都能經常見到,所以本文儘量不列舉二維圖表,儘量多的從 3D 圖表玩起。

PS:順便說一下, pyecharts 的文件質量非常好,所有的圖表都有示例,對於剛接觸的新手來講十分友好,啥也不會的前提下,把 Demo CV 出來就能直接執行,學習程式碼,從 CV 開始。

以下示例均來自官方文件的示例,各位別噴我抄襲就成。

3D 柱狀圖

首先是 3D 柱狀圖, 2D 的柱狀圖各位同學應該經常能見到, 3D 的應該比較少見,我們先來看下效果:

示例的部分程式碼 Bar3d_punch_card.py

import pyecharts.options as opts
from pyecharts.charts import Bar3D

# 省略部分資料程式碼

data = [[d[1], d[0], d[2]] for d in data]

(
    Bar3D(init_opts=opts.InitOpts(width="1600px", height="800px"))
    .add(
        series_name="",
        data=data,
        xaxis3d_opts=opts.Axis3DOpts(type_="category", data=hours),
        yaxis3d_opts=opts.Axis3DOpts(type_="category", data=days),
        zaxis3d_opts=opts.Axis3DOpts(type_="value"),
    )
    .set_global_opts(
        visualmap_opts=opts.VisualMapOpts(
            max_=20,
            range_color=[
                "#313695",
                "#4575b4",
                "#74add1",
                "#abd9e9",
                "#e0f3f8",
                "#ffffbf",
                "#fee090",
                "#fdae61",
                "#f46d43",
                "#d73027",
                "#a50026",
            ],
        )
    )
    .render("bar3d_punch_card.html")
)

因為是 3D 圖形,我們的資料是一個三維資料,上面的示例沒有資料的程式碼,由於太長了,所以就沒放。不過所有的程式碼都會上傳至程式碼倉庫,有需要的銅須可以去程式碼倉庫獲取。

日曆圖

如果經常上 GitHub ,那麼對這張圖表一定很熟悉:

這個就是日曆圖,上圖是我本人的 GitHub 的提交記錄,同樣, pyecharts 也為我們提供了日曆圖的方法,示例如下:

import datetime
import random

from pyecharts import options as opts
from pyecharts.charts import Calendar


begin = datetime.date(2019, 1, 1)
end = datetime.date(2019, 12, 31)
data = [
    [str(begin + datetime.timedelta(days=i)), random.randint(1, 20)]
    for i in range((end - begin).days + 1)
]

c = (
    Calendar()
    .add("", data, calendar_opts=opts.CalendarOpts(range_="2019"))
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Calendar-2019 Github 提交情況"),
        visualmap_opts=opts.VisualMapOpts(
            max_=20,
            min_=1,
            orient="horizontal",
            is_piecewise=True,
            pos_top="230px",
            pos_left="100px",
        ),
    )
    .render("calendar_base.html")
)

結果如下:

儀表盤

儀表盤經常用來表示一件事情的完成情況,看著很高大上的樣子,在 pyecharts 想做一個儀表盤實際上非常簡單。

示例如下:

from pyecharts import options as opts
from pyecharts.charts import Gauge

c = (
    Gauge()
    .add("", [("完成率", 80)])
    .set_global_opts(title_opts=opts.TitleOpts(title="Gauge-基本示例"))
    .render("gauge_base.html")
)

結果如下:

關係圖

關係圖,顧名思義就是描述關係的圖,有時候我們看電視劇,出現的人物比較多記不住的時候,可以用 pyecharts 畫個關係圖捋順關係(我真是個小機靈鬼)。

示例如下:

from pyecharts import options as opts
from pyecharts.charts import Graph

nodes = [
    {"name": "肖恩", "symbolSize": 10},
    {"name": "海棠朵朵", "symbolSize": 20},
    {"name": "長公主", "symbolSize": 30},
    {"name": "陳萍萍", "symbolSize": 40},
    {"name": "範閒", "symbolSize": 50},
    {"name": "林婉兒", "symbolSize": 40},
    {"name": "慶帝", "symbolSize": 30},
    {"name": "範若若", "symbolSize": 20},
    {"name": "司理理", "symbolSize": 10}
]
links = []
for i in nodes:
    for j in nodes:
        links.append({"source": i.get("name"), "target": j.get("name")})
c = (
    Graph()
    .add("", nodes, links, repulsion=8000)
    .set_global_opts(title_opts=opts.TitleOpts(title="慶餘年人物關係圖"))
    .render("graph_base.html")
)

結果如下:

我這裡就簡單的使用「慶餘年」的人物關係隨便畫了一下,不要當真哦。

3D 折線圖

這個示例就是經典中的經典了,旋轉中的彈簧,完全摘自官方文件:

import math

from pyecharts import options as opts
from pyecharts.charts import Line3D
from pyecharts.faker import Faker

data = []
for t in range(0, 25000):
    _t = t / 1000
    x = (1 + 0.25 * math.cos(75 * _t)) * math.cos(_t)
    y = (1 + 0.25 * math.cos(75 * _t)) * math.sin(_t)
    z = _t + 2.0 * math.sin(75 * _t)
    data.append([x, y, z])
c = (
    Line3D()
    .add(
        "",
        data,
        xaxis3d_opts=opts.Axis3DOpts(Faker.clock, type_="value"),
        yaxis3d_opts=opts.Axis3DOpts(Faker.week_en, type_="value"),
        grid3d_opts=opts.Grid3DOpts(
            width=100, depth=100, rotate_speed=150, is_rotate=True
        ),
    )
    .set_global_opts(
        visualmap_opts=opts.VisualMapOpts(
            max_=30, min_=0, range_color=Faker.visual_color
        ),
        title_opts=opts.TitleOpts(title="Line3D-旋轉的彈簧"),
    )
    .render("line3d_autorotate.html")
)

結果如下:

這個示例中的難點在於使用三角函式,算出彈簧上的每一個點的空間位置,(x, y, z) 然後再將這組資料繪製在圖表中,這個演算法數學功底不好的人還真的看不懂(比如說小編我)。

水球圖

水球圖的命名就相當的形象了,我們先看下水球圖長啥樣:

我們使用 pyecharts 畫水球圖其實很簡單的,如下:

from pyecharts import options as opts
from pyecharts.charts import Liquid

c = (
    Liquid()
    .add("lq", [0.6, 0.7])
    .set_global_opts(title_opts=opts.TitleOpts(title="Liquid-基本示例"))
    .render("liquid_base.html")
)

示例中的兩個引數 0.6 和 0.7 ,分別是後面的圖層百分比和前面的圖層百分比。

百度地圖

pyecharts 還支援百度地圖上的一些操作,這對於需要使用地圖做圖的同學來講不得不說是一個福音,比如下面的全國主要城市空氣質量圖:

或者還有北京的公交線路圖:

這兩個示例程式碼都有點長,我就不貼出來了,有興趣的同學可以訪問我的程式碼倉庫或者官方文件獲取示例程式碼。

多 BB 兩句

能看到這裡的應該都是真愛了,就容我多 BB 兩句,這篇文章不僅僅是這個系列的最後一篇,同樣也是整個「小白學 Python」的最後一篇了,從去年的 11 月份開始寫,直到今天,耗時差不多 5 個月,輸出了「基礎系列」、「爬蟲系列」、「資料分析系列」共計 84 篇內容,這個過程中,確實收穫滿滿,不知道有沒有從一開始跟著看能看到現在的朋友,如果有可以在評論區舉手。

還記得去年剛開始寫的時候,有很多同學加我微信,應該和很多人都聊過我後面的規劃,今天,我終於完成了這個規劃,感覺很開心也很有成就感,感謝各位同學的一路陪伴和支援,後續還會繼續分享 python 相關的內容,還希望各位能繼續捧場。

後續的內容已經在規劃中了,各位不會等太久(想搞點機器學習相關的入門內容,不知道搞不搞得定,不管搞不搞得定,先搞了再說)。

這次其實挺想給自己放個假的,但是不敢停下來,做一件事情,能堅持這麼久,確實很不容易,如果一旦停下來,再想撿起來,這難度將會成倍數的上漲,我不敢保證自己還能撿的起來,所以,繼續加油!奧利給!

程式碼倉庫

老規矩,所有的示例程式碼都會上傳至程式碼管理倉庫 Github 和 Gitee 上,方便大家取用。

示例程式碼-Github

示例程式碼-Gitee

參考

http://gallery.pyecharts.org/#/REA