首頁 > 軟體

Python資料視覺化之Pyecharts使用詳解

2022-04-20 19:00:02

1. 安裝Pyecharts

pip install pyecharts

2. 圖表基礎

2.1 主題風格

新增主題風格使用的是 InitOpts() 方法,

該方法的主要引數有:

引數描述
width畫布寬度,要求字串格式,如 width=“500px”
height畫布高度,要求字串格式,如 width=“500px”
chart_id圖表ID,作為圖表的唯一標識。有多個圖表時用來區分不同的圖表
page_title網頁標題,字串格式
theme圖表主題。由ThemeType模組提供
bg_color圖表背景顏色,字串格式

可以選擇的風格有:

2.2 圖表標題

給圖表新增標題需要通過 set_global_options()方法 的 title_opts引數,

該引數的值通過opts模組的TitleOpts()方法生成,

且TitleOpts()方法主要引數語法如下:

2.3 圖例

設定圖例需要通過 set_global_opts()方法的 legend_opts引數,

該引數的引數值參考options模組的LegendOpts()方法。

LegendOpts() 方法的主要引數如下:

2.4 提示框

設定提示框主要是通過 set_global_opts()方法中的 tooltip_opts引數進行設定,

該引數的引數值參考options模組的TooltipOpts()方法。

TooltipOpts()方法的主要引數如下:

2.5 視覺對映

視覺對映通過 set_global_opts()方法中的 visualmap_opts引數進行設定,

該引數的取值參考options模組的VisualMapOpts()方法。

其主要引數如下:

2.6 工具箱

工具箱通過 set_global_opts()方法中的 toolbox_opts引數進行設定,

該引數的取值參考options模組的ToolboxOpts()方法。

其主要引數如下:

2.7 區域縮放

區域縮放通過 set_global_opts()方法中的 datazoom_opts引數進行設定,

該引數的取值參考options模組的DataZoomOpts()方法。

其主要引數如下:

3. 柱狀圖 Bar模組

繪製柱狀圖通過Bar模組來實現,

該模組的主要方法有:

主要方法描述
add_xaxis()x軸資料
add_yaxis()y軸資料
reversal_axis()翻轉x、y軸資料
add_dataset()原始資料

下邊展示一個簡單的範例,先不使用過多複雜的樣式:

import numpy as np
from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.globals import ThemeType

# 生成資料
years = [2011, 2012, 2013, 2014, 2015]
y1 = [1, 3, 5, 7, 9]
y2 = [2, 4, 6, 4, 2]
y3 = [9, 7, 5, 3, 1]
y4 = list(np.random.randint(1, 10, 10))

bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
# 為柱狀圖新增x軸和y軸資料
bar.add_xaxis(years)
bar.add_yaxis('A型', y1)
bar.add_yaxis('B型', y2)
bar.add_yaxis('C型', y3)
bar.add_yaxis('D型', y4)
# 渲染圖表到HTML檔案,並儲存在當前目錄下
bar.render("bar.html")

生成影象效果如下:

這裡有一個無法解釋的細節,就是可以看到y4資料,即D型,在影象中沒有顯示出來。經過小啾的反覆嘗試,發現凡是使用亂數產生的資料再轉化成列表,這部分亂數不會被寫入到html檔案中:

既然不會解釋,那就避免。

4. 折線圖/面積圖 Line模組

Line模組的主要方法有add_xaxis() 和 add_yaxis(),分別用來新增x軸資料和y軸資料。

add_yaxis()的主要引數如下:

4.1 折線圖

繪製折線圖時,x軸的資料必須是字串,圖線方可正常顯示。

from pyecharts.charts import Line
from pyecharts import options as opts
from pyecharts.globals import ThemeType

# 準備資料
x = [2011, 2012, 2013, 2014, 2015]
x_data = [str(i) for i in x]
y1 = [1, 3, 2, 5, 8]
y2 = [2, 6, 5, 6, 7]
y3 = [5, 7, 4, 3, 1]

line = Line(init_opts=opts.InitOpts(theme=ThemeType.ESSOS))
line.add_xaxis(xaxis_data=x_data)
line.add_yaxis(series_name="A類", y_axis=y1)
line.add_yaxis(series_name="B類", y_axis=y2)
line.add_yaxis(series_name="C類", y_axis=y3)
line.render("line.html")

生成影象效果如下:

4.2 面積圖

繪製面積圖時需要在add_yaxis()方法中指定areastyle_opts引數。其值由options模組的AreaStyleOpts()方法提供。

from pyecharts.charts import Line
from pyecharts import options as opts
from pyecharts.globals import ThemeType


x = [2011, 2012, 2013, 2014, 2015]
x_data = [str(i) for i in x]
y1 = [2, 5, 6, 8, 9]
y2 = [1, 4, 5, 4, 7]
y3 = [1, 3, 4, 6, 6]

line = Line(init_opts=opts.InitOpts(theme=ThemeType.WONDERLAND))

line.add_xaxis(xaxis_data=x_data)
line.add_yaxis(series_name="A類", y_axis=y1, areastyle_opts=opts.AreaStyleOpts(opacity=1))
line.add_yaxis(series_name="B類", y_axis=y2, areastyle_opts=opts.AreaStyleOpts(opacity=1))
line.add_yaxis(series_name="C類", y_axis=y3, areastyle_opts=opts.AreaStyleOpts(opacity=1))

line.render("line2.html")

影象效果如下:

5.餅形圖

5.1 餅形圖

繪製餅形圖使用的是Pie模組,該模組中需要使用的主要方法是add()方法

該方法主要引數如下:

主要引數描述
series_name系列名稱。用於提示文字和圖例標籤。
data_pair資料項,格式為形如[(key1,value1),(key2,value2)]
color系列標籤的顏色。
radius餅圖的半徑。預設設成百分比形式,預設是相對於容器的高和寬中較小的一方的一半
rosetype是否展開為南丁格爾玫瑰圖,可以取的值有radius貨area,radius表示通過磁區圓心角展現資料的大小,即預設的扇形圖;area表示所有磁區的圓心角的角度相同,通過半徑來展現資料大小
from pyecharts.charts import Pie
from pyecharts import options as opts
from pyecharts.globals import ThemeType

x_data = ['AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'FFF']
y_data = [200, 200, 100, 400, 500, 600]
# 將資料轉換為目標格式
data = [list(z) for z in zip(x_data, y_data)]
# 資料排序
data.sort(key=lambda x: x[1])

pie = Pie(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))

pie.add(
        series_name="類別",    # 序列名稱
        data_pair=data,     # 資料
    )
pie.set_global_opts(
        # 餅形圖示題
        title_opts=opts.TitleOpts(
            title="各類別數量分析",
            pos_left="center"),
        # 不顯示圖例
        legend_opts=opts.LegendOpts(is_show=False),
    )
pie.set_series_opts(
        # 序列標籤
        label_opts=opts.LabelOpts(),
    )

pie.render("pie.html")

影象效果如下:

5.2 南丁格爾玫瑰圖

from pyecharts.charts import Pie
from pyecharts import options as opts
from pyecharts.globals import ThemeType


x_data = ['AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'FFF', 'GGG', 'HHH', 'III', 'JJJ', 'KKK', 'LLL', 'MMM', 'NNN', 'OOO']
y_data = [200, 100, 400, 50, 600, 300, 500, 700, 800, 900, 1000, 1100, 1200, 1300, 1500]
# 將資料轉換為目標格式
data = [list(z) for z in zip(x_data, y_data)]
# 資料排序
data.sort(key=lambda x: x[1])

# 建立餅形圖並設定畫布大小
pie = Pie(init_opts=opts.InitOpts(theme=ThemeType.ROMANTIC, width='300px', height='400px'))
# 為餅形圖新增資料
pie.add(
        series_name="類別",
        data_pair=data,
        radius=["8%", "160%"],  # 內外半徑
        center=["65%", "65%"],  # 位置
        rosetype='area',       # 玫瑰圖,圓心角相同,按半徑大小繪製
        color='auto'           # 顏色自動漸變
    )
pie.set_global_opts(
        # 不顯示圖例
        legend_opts=opts.LegendOpts(is_show=False),
        # 視覺對映
        visualmap_opts=opts.VisualMapOpts(is_show=False,
         min_=100,    # 顏色條最小值
         max_=450000, # 顏色條最大值
    )
)
pie.set_series_opts(
        # 序列標籤
        label_opts=opts.LabelOpts(position='inside',  # 標籤位置
                                  rotate=45,
                                  font_size=8)       # 字型大小
    )

pie.render("pie2.html")

影象效果如下:

6. 箱線圖 Boxplot模組

繪製箱線圖使用的是Boxplot類。

這裡有一個細節,準備y軸資料y_data時需要在列表外再套一層列表,否則圖線不會被顯示。

繪製箱線圖使用的是Boxplot模組,

主要的方法有

add_xaxis()和add_yaxis()

from pyecharts.charts import Boxplot
from pyecharts.globals import ThemeType
from pyecharts import options as opts

y_data = [[5, 20, 22, 21, 23, 26, 25, 24, 28, 26, 29, 30, 50, 61]]

boxplot = Boxplot(init_opts=opts.InitOpts(theme=ThemeType.INFOGRAPHIC))

boxplot.add_xaxis([""])
boxplot.add_yaxis('', y_axis=boxplot.prepare_data(y_data))
boxplot.render("boxplot.html")

影象效果如下:

7. 漣漪特效散點圖 EffectScatter模組

繪製漣漪圖使用的是EffectScatter模組,程式碼範例如下:

from pyecharts.charts import EffectScatter
from pyecharts import options as opts
from pyecharts.globals import ThemeType


x = [2011, 2012, 2013, 2014, 2015]
x_data = [str(i) for i in x]
y1 = [1, 3, 2, 5, 8]
y2 = [2, 6, 5, 6, 7]
y3 = [5, 7, 4, 3, 1]

scatter = EffectScatter(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE))
scatter.add_xaxis(x_data)
scatter.add_yaxis("", y1)
scatter.add_yaxis("", y2)
scatter.add_yaxis("", y3)
# 渲染圖表到HTML檔案,存放在程式所在目錄下
scatter.render("EffectScatter.html")

影象效果如下:

8. 詞雲圖 WordCloud模組

繪製詞雲圖使用的是WordCloud模組,

主要的方法有add()方法。

add()方法的主要引數如下:

add()方法主要的引數有

準備一個txt檔案(001.txt),文字內容以《蘭亭集序》為例:

永和九年,歲在癸丑,暮春之初,會於會稽山陰之蘭亭,修禊事也。群賢畢至,少長鹹集。此地有崇山峻嶺,茂林修竹,又有清流激湍,映帶左右,引以為流觴曲水,列坐其次。雖無絲竹管絃之盛,一觴一詠,亦足以暢敘幽情。
是日也,天朗氣清,惠風和暢。仰觀宇宙之大,俯察品類之盛,所以遊目騁懷,足以極視聽之娛,信可樂也。
夫人之相與,俯仰一世。或取諸懷抱,悟言一室之內;或因寄所託,放浪形骸之外。雖趣舍萬殊,靜躁不同,當其欣於所遇,暫得於己,快然自足,不知老之將至;及其所之既倦,情隨事遷,感慨系之矣。向之所欣,俯仰之間,已為陳跡,猶不能不以之興懷,況修短隨化,終期於盡!古人云:“死生亦大矣。”豈不痛哉!
每覽昔人興感之由,若合一契,未嘗不臨文嗟悼,不能喻之於懷。固知一死生為虛誕,齊彭殤為妄作。後之視今,亦猶今之視昔,悲夫!故列敘時人,錄其所述,雖世殊事異,所以興懷,其致一也。後之覽者,亦將有感於斯文。

程式碼範例如下:

from pyecharts.charts import WordCloud
from jieba import analyse

# 基於TextRank演演算法從文字中提取關鍵詞
textrank = analyse.textrank
text = open('001.txt', 'r', encoding='UTF-8').read()
keywords = textrank(text, topK=30)
list1 = []
tup1 = ()

# 關鍵詞列表
for keyword, weight in textrank(text, topK=30, withWeight=True):
    # print('%s %s' % (keyword, weight))
    tup1 = (keyword, weight)  # 關鍵詞權重
    list1.append(tup1)     # 新增到列表中

# 繪製詞雲圖
mywordcloud = WordCloud()
mywordcloud.add('', list1, word_size_range=[20, 100])
mywordcloud.render('wordclound.html')

詞雲圖效果如下:

9. 熱力圖 HeatMap模組

繪製熱力圖使用的是HeatMap模組。

下邊以雙色球案例為例,資料使用生成的亂數,繪製出熱力圖:

import pyecharts.options as opts
from pyecharts.charts import HeatMap
import pandas as pd
import numpy as np

# 建立一個33行7列的DataFrame,資料使用亂數生成。每個資料表示該位置上該數位出現的次數
s1 = np.random.randint(0, 200, 33)
s2 = np.random.randint(0, 200, 33)
s3 = np.random.randint(0, 200, 33)
s4 = np.random.randint(0, 200, 33)
s5 = np.random.randint(0, 200, 33)
s6 = np.random.randint(0, 200, 33)
s7 = np.random.randint(0, 200, 33)
data = pd.DataFrame(
    {'位置一': s1,
     '位置二': s2,
     '位置三': s3,
     '位置四': s4,
     '位置五': s5,
     '位置六': s6,
     '位置七': s7
     },
    index=range(1, 34)
)

# 資料轉換為HeatMap支援的列表格式
value1 = []
for i in range(7):
    for j in range(33):
        value1.append([i, j, int(data.iloc[j, i])])
# 繪製熱力圖
x = data.columns
heatmap=HeatMap(init_opts=opts.InitOpts(width='600px' ,height='650px'))
heatmap.add_xaxis(x)
heatmap.add_yaxis("aa", list(data.index), value=value1,  # y軸資料
                  # y軸標籤
                  label_opts=opts.LabelOpts(is_show=True, color='white', position="center"))
heatmap.set_global_opts(title_opts=opts.TitleOpts(title="雙色球中獎號碼熱力圖", pos_left="center"),
                        legend_opts=opts.LegendOpts(is_show=False),  # 不顯示圖例
                        # 座標軸設定項
                        xaxis_opts=opts.AxisOpts(
                        type_="category",  # 類目軸
                        # 分隔區域設定項
                        splitarea_opts=opts.SplitAreaOpts(
                            is_show=True,  # 區域填充樣式
                            areastyle_opts=opts.AreaStyleOpts(opacity=1)
                        ),
                        ),
                        # 座標軸設定項
                        yaxis_opts=opts.AxisOpts(
                        type_="category",  # 類目軸
                        # 分隔區域設定項
                        splitarea_opts=opts.SplitAreaOpts(
                            is_show=True,
                            # 區域填充樣式
                            areastyle_opts=opts.AreaStyleOpts(opacity=1)
                            ),
                            ),

                        # 視覺對映設定項
                        visualmap_opts=opts.VisualMapOpts(is_piecewise=True,    # 分段顯示
                                                          min_=1, max_=170,     # 最小值、最大值
                                                          orient='horizontal',  # 水平方向
                                                          pos_left="center")    # 居中
                        )
heatmap.render("heatmap.html")

熱力圖效果如下:

10. 水球圖 Liquid模組

繪製水球圖使用的是Liquid模組。

from pyecharts.charts import Liquid
liquid = Liquid()
liquid.add('', [0.39])
liquid.render("liquid.html")

水球圖效果如下:

11. 日曆圖 Calendar模組

繪製日曆圖使用的是Calendar模組

主要使用的方法是add()方法

import pandas as pd
import numpy as np
from pyecharts import options as opts
from pyecharts.charts import Calendar
data = list(np.random.random(30))
# 求最大值和最小值
mymax = round(max(data), 2)
mymin = round(min(data), 2)
# 生成日期
index = pd.date_range('20220401', '20220430')
# 合併列表
data_list = list(zip(index, data))
# 生成日曆圖
calendar = Calendar()
calendar.add("",
             data_list,
             calendar_opts=opts.CalendarOpts(range_=['2022-04-01', '2022-04-30']))
calendar.set_global_opts(
        title_opts=opts.TitleOpts(title="2022年4月某指標情況", pos_left='center'),
        visualmap_opts=opts.VisualMapOpts(
            max_=mymax,
            min_=mymin+0.1,
            orient="horizontal",
            is_piecewise=True,
            pos_top="230px",
            pos_left="70px",
        ),
    )
calendar.render("calendar.html")

日曆圖效果如下:

以上就是Python資料視覺化之Pyecharts使用詳解的詳細內容,更多關於Python Pyecharts的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com