本文是爲了幫助大家快速掌握十大頂級繪圖方法,重點解釋 數據 是如何呈現在不同類型圖中。

使用 pip install pyecharts 安裝,安裝後的版本爲 v1.6

pyecharts 幾行代碼就能繪製出有特色的的圖形,繪圖API鏈式調用,使用方便。

1 儀表盤

from pyecharts import charts

# 儀表盤
gauge = charts.Gauge()
gauge.add('Python小例子', [('Python機器學習', 30), ('Python基礎', 70.),
                        ('Python正則', 90)])
gauge.render(path="./data/儀表盤.html")
print('ok')

儀表盤中共展示三項,每項的比例爲30%,70%,90%,如下圖默認名稱顯示第一項: Python機器學習 ,完成比例爲 30%

2 漏斗圖

from pyecharts import options as opts
from pyecharts.charts import Funnel, Page
from random import randint

def funnel_base() -> Funnel:
    c = (
        Funnel()
        .add("豪車", [list(z) for z in zip(['寶馬', '法拉利', '奔馳', '奧迪', '大衆', '豐田', '特斯拉'],
                                         [randint(1, 20) for _ in range(7)])])
        .set_global_opts(title_opts=opts.TitleOpts(title="豪車漏斗圖"))
    )
    return c
    
funnel_base().render('./img/car_funnel.html')
print('ok')

以7種車型及某個屬性值繪製的漏斗圖,屬性值大越靠近漏斗的大端。

3 日曆圖

import datetime
import random

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


def calendar_interval_1() -> Calendar:
    begin = datetime.date(2019, 1, 1)
    end = datetime.date(2019, 12, 27)
    data = [
        [str(begin + datetime.timedelta(days=i)), random.randint(1000, 25000)]
        for i in range(0, (end - begin).days + 1, 2)  # 隔天統計
    ]

    calendar = (
        Calendar(init_opts=opts.InitOpts(width="1200px")).add(
            "", data, calendar_opts=opts.CalendarOpts(range_="2019"))
        .set_global_opts(
            title_opts=opts.TitleOpts(title="Calendar-2019年步數統計"),
            visualmap_opts=opts.VisualMapOpts(
                max_=25000,
                min_=1000,
                orient="horizontal",
                is_piecewise=True,
                pos_top="230px",
                pos_left="100px",
            ),
        )
    )
    return calendar


calendar_interval_1().render('./img/calendar.html')
print('ok')

繪製2019年1月1日到12月27日的步行數,官方給出的圖形寬度 900px 不夠,只能顯示到9月份,本例使用 opts.InitOpts(width="1200px") 做出微調,並且 visualmap 顯示所有步數,每隔一天顯示一次:

4 圖(graph)

import json
import os

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


def graph_base() -> Graph:
    nodes = [
        {"name": "cus1", "symbolSize": 10},
        {"name": "cus2", "symbolSize": 30},
        {"name": "cus3", "symbolSize": 20}
    ]
    links = []
    for i in nodes:
        if i.get('name') == 'cus1':
            continue
        for j in nodes:
            if j.get('name') == 'cus1':
                continue
            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="customer-influence"))
    )
    return c

構建圖,其中客戶點1與其他兩個客戶都沒有關係( link ),也就是不存在有效邊:

5 水球圖

from pyecharts import options as opts
from pyecharts.charts import Liquid, Page
from pyecharts.globals import SymbolType


def liquid() -> Liquid:
    c = (
        Liquid()
        .add("lq", [0.67, 0.30, 0.15])
        .set_global_opts(title_opts=opts.TitleOpts(title="Liquid"))
    )
    return c


liquid().render('./img/liquid.html')

水球圖的取值 [0.67, 0.30, 0.15] 表示下圖中的 三個波浪線 ,一般代表三個百分比:

6 餅圖

from pyecharts import options as opts
from pyecharts.charts import Pie
from random import randint

def pie_base() -> Pie:
    c = (
        Pie()
        .add("", [list(z) for z in zip(['寶馬', '法拉利', '奔馳', '奧迪', '大衆', '豐田', '特斯拉'],
                                       [randint(1, 20) for _ in range(7)])])
        .set_global_opts(title_opts=opts.TitleOpts(title="Pie-基本示例"))
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
    )
    return c

pie_base().render('./img/pie_pyecharts.html')

7 極座標

import random
from pyecharts import options as opts
from pyecharts.charts import Page, Polar

def polar_scatter0() -> Polar:
    data = [(alpha, random.randint(1, 100)) for alpha in range(101)] # r = random.randint(1, 100)
    print(data)
    c = (
        Polar()
        .add("", data, type_="bar", label_opts=opts.LabelOpts(is_show=False))
        .set_global_opts(title_opts=opts.TitleOpts(title="Polar"))
    )
    return c


polar_scatter0().render('./img/polar.html')

極座標表示爲 (夾角,半徑) ,如(6,94)表示"夾角"爲6,半徑94的點:

8 詞雲圖

from pyecharts import options as opts
from pyecharts.charts import Page, WordCloud
from pyecharts.globals import SymbolType


words = [
    ("Python", 100),
    ("C++", 80),
    ("Java", 95),
    ("R", 50),
    ("JavaScript", 79),
    ("C", 65)
]


def wordcloud() -> WordCloud:
    c = (
        WordCloud()
        # word_size_range: 單詞字體大小範圍
        .add("", words, word_size_range=[20, 100], shape='cardioid')
        .set_global_opts(title_opts=opts.TitleOpts(title="WordCloud"))
    )
    return c


wordcloud().render('./img/wordcloud.html')

("C",65) 表示在本次統計中C語言出現65次

9 系列柱狀圖

from pyecharts import options as opts
from pyecharts.charts import Bar
from random import randint


def bar_series() -> Bar:
    c = (
        Bar()
        .add_xaxis(['寶馬', '法拉利', '奔馳', '奧迪', '大衆', '豐田', '特斯拉'])
        .add_yaxis("銷量", [randint(1, 20) for _ in range(7)])
        .add_yaxis("產量", [randint(1, 20) for _ in range(7)])
        .set_global_opts(title_opts=opts.TitleOpts(title="Bar的主標題", subtitle="Bar的副標題"))
    )
    return c


bar_series().render('./img/bar_series.html')

10 熱力圖

import random
from pyecharts import options as opts
from pyecharts.charts import HeatMap


def heatmap_car() -> HeatMap:
    x = ['寶馬', '法拉利', '奔馳', '奧迪', '大衆', '豐田', '特斯拉']
    y = ['中國','日本','南非','澳大利亞','阿根廷','阿爾及利亞','法國','意大利','加拿大']
    value = [[i, j, random.randint(0, 100)]
             for i in range(len(x)) for j in range(len(y))]
    c = (
        HeatMap()
        .add_xaxis(x)
        .add_yaxis("銷量", y, value)
        .set_global_opts(
            title_opts=opts.TitleOpts(title="HeatMap"),
            visualmap_opts=opts.VisualMapOpts(),
        )
    )
    return c

heatmap_car().render('./img/heatmap_pyecharts.html')

覺得不錯,點個在看唄!

相關文章