Python資料視覺化---pygal模組

merlin&發表於2020-04-20

pygal模組

安裝pygal模組

pygal模組的安裝非常簡單,只需輸入一行pip命令即可

pip install pygal

安裝完成:

pygal模組介紹

pygal官網地址
pygal是Python的第三方庫,他的主要功能就是資料視覺化,即將數字轉化成圖表的形式來呈現,它提供的圖表樣式有柱狀圖、折線圖、餅狀圖、雷達圖......

柱狀圖

pygal柱狀圖官方文件

單列柱狀圖
import pygal

view = pygal.Bar()
#圖表名
view.title = '柱狀圖'
#新增資料
view.add('numbers', [0,2,4,6,8,10])
#在瀏覽器中檢視
#view.render_in_browser()
#儲存為view.svg(也可以儲存為jpg)
view.render_to_file('view.svg')

效果圖:

注意:svg圖片用系統自帶瀏覽器開啟可能會顯示全黑色,可以嘗試使用Google瀏覽器開啟
多列柱狀圖

#新增資料
view.add('numbers', [0,2,4,6,8,10])
view.add('numbers_2', [0,1,3,5,7,9])

堆疊柱狀圖
view = pygal.StackedBar()

橫向柱狀圖
view = pygal.HorizontalStackedBar()

折線圖

pygal折線圖官方文件

簡單折線圖
import pygal

view = pygal.Line()
#圖表名
view.title = '折線圖'
#新增資料
view.add('numbers', [0,2,4,6,8,10])
view.add('numbers_2', [0,1,3,5,7,9])
#在瀏覽器中檢視
#view.render_in_browser()
#儲存為view.svg(也可以儲存為jpg)
view.render_to_file('view.svg')

效果圖:

縱向折線圖
view = pygal.HorizontalLine()

堆疊折線圖
view = pygal.StackedLine(fill=True)

餅狀圖

pygal餅狀圖官方文件

簡單餅狀圖
import pygal

view = pygal.Pie()
#圖表名
view.title = '餅狀圖'
#新增資料
view.add('A', 31)
view.add('B', 55)
view.add('C', 14)
#儲存為view.svg(也可以儲存為jpg)
view.render_to_file('view.svg')

效果圖:

多級餅狀圖
#新增資料
view.add('A', [31,25])
view.add('B', [55,38])
view.add('C', [14,37])

圓環圖
#設定空心圓半徑
view = pygal.Pie(inner_radius=0.4)

半圓圖
view = pygal.Pie(half_pie=True)

雷達圖

pygal官方文件

基礎雷達圖
import pygal

view = pygal.Radar()
#圖表名
view.title = '雷達圖'
#新增資料(可以為任意個)
view.add('A', [31,56,34,67,34])
view.add('B', [23,18,57,45,35])
view.add('C', [14,45,76,34,76])
#儲存為view.svg(也可以儲存為jpg)
view.render_to_file('view.svg')

效果圖:

其他圖表介紹

直方圖
盒子圖
圓點圖
座標圖
錐形圖
環狀圖
儀表圖
塔形圖
樹圖
地圖

爬取中國福彩網彩票資料並以圖表形式顯示

網頁分析

首先開啟中國福彩網,點選雙色球,選擇往期開獎欄目
進入欄目後,選定往期的獎金數目作為我們想要爬取的目標內容

明確目標後,開始尋找資料所在的位置
滑鼠右擊頁面,開啟網頁原始碼,在原始碼中搜尋是否存在獎金金額數目

搜尋過後,發現這個金額資料沒有在網頁的原始碼中,所以想到用抓包的方式來嘗試獲取這些金額資料
右擊檢查,選擇network選項卡,按下ctrl+r鍵重新整理介面,開始捕捉資料包
在過濾掉一些png、jpg的資料包之後,我們鎖定了一個以findDrawNotice開頭的資料包,開啟觀察資料包的內容,發現這個正是我們想要抓取的資料包


現在已經找到了想要抓包的內容,現在可以開始著手寫程式碼了

資料提取

我們分析過網頁之後,選定了要抓取的資料包,開始使用requests請求來獲取資料

url = 'http://www.cwl.gov.cn/cwl_admin/kjxx/findDrawNotice?name=ssq&issueCount=30'
headers = {
    "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36",
    "Referer":"http://www.cwl.gov.cn/kjxx/ssq/"
           }
response = requests.get(url,headers=headers).text

這個網頁可能會有一個小的反爬措施,於是我們就在headers中加入user-agent和referer兩個頭資訊
我們使用print語句來列印一下response的內容

print之後會發現這個內容是以字串的格式列印出來的,如果我們想從中提取資料,則必須將它轉換成字典的格式

data_json = json.loads(response)     #將資料轉換為json格式

將資料轉換之後,我們就可以使用鍵值對的方式來提取我們想要的資料了

datas = data_json["result"]
for data in datas:
    prizegrades = data["prizegrades"]          #包含中獎金額的字典提取
    for item in prizegrades:
        print(item)
        typemoney = item['typemoney']        #中獎金額提取
        print(typemoney)

這裡我們嘗試著逐層提取彩票的獎金資訊,提取到最近的一層時,將資料列印出來分析資料

可以看到前三個和我們想要提取的資料內容是一致的,這些type後面的數字指的是獎金的等級,就是說對應到的號碼是多少就是幾等獎
到此為止,我們已經將需要獲取的中獎金額提取出來了

轉換資料

等我們看到這些資料的時候,雖然看到的是數字形式,但是他的資料型別確是字元形,通過此前對pygal模組的瞭解,我們知道這個模組只可以將整形的數字轉換成圖表格式。
所以我們需要做的就是將每一個數字提取出來,並且轉換成整形存入到列表中
由於我們想要提取的只是一等獎的獎金金額(因為二、三等獎的金額遠小於一等獎,不適合在圖表中觀察),所以這裡我加上了一個if語句判斷

money_list = []       #建立空列表
for data in datas:
    prizegrades = data["prizegrades"]
    for item in prizegrades:
        type_num = item['type']
        typemoney = item['typemoney']
        if type_num == 1:       #判斷獎金等級是否為1
            money_list.append(int(typemoney))

但是我在執行這段程式碼的時候會提示錯誤,經過我的一番瘋狂分析(百度求助),發現出錯的原因是在提取獎金的時候會出現下劃線和空字串的干擾,而int轉換資料型別則只能裝換純數字組成的字串,所以轉換的過程中會報錯。但是這並不是一個大問題,我們只需要寫一個if語句來跳過非法字串就可以解決了,下面是正確的程式碼:

money_list = []       #建立空列表
for data in datas:
    prizegrades = data["prizegrades"]
    for item in prizegrades:
        typemoney = item['typemoney']
                if type_num == 1:            #判斷獎金等級是否為1
            if typemoney == "":       #忽略空字元
                pass
            elif typemoney == "_":     #忽略下劃線
                pass
            else:           #將其他的可用數字放入列表
                money_list.append(int(typemoney))
print(money_list)

觀察輸出:

將資料轉換成圖表

#設定圖表樣式為柱狀圖
view = pygal.Bar()
#圖表名
view.title = '獎金金額(¥)'
#將資料填入圖表
view.add('money',money_list)
#在瀏覽器中顯示圖表
view.render_in_browser()

完整程式碼

import json
import pygal

url = 'http://www.cwl.gov.cn/cwl_admin/kjxx/findDrawNotice?name=ssq&issueCount=30'
headers = {
    "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36",
    "Referer":"http://www.cwl.gov.cn/kjxx/ssq/"
           }
response = requests.get(url,headers=headers).text
data_json = json.loads(response)
datas = data_json["result"]
money_list = []       #建立空列表
for data in datas:
    prizegrades = data["prizegrades"]
    for item in prizegrades:
        type_num = item['type']
        typemoney = item['typemoney']
        if type_num == 1:                         #判斷獎金等級是否為1
            if typemoney == "":       #忽略空字元
                pass
            elif typemoney == "_":     #忽略下劃線
                pass
            else:           #將其他的可用數字放入列表
                money_list.append(int(typemoney))

#設定圖表樣式為柱狀圖
view = pygal.Bar()
#圖表名
view.title = '獎金金額(¥)'
#將資料填入圖表
view.add('money',money_list)
#在瀏覽器中顯示圖表
view.render_in_browser()

實現結果

相關文章