Python數據可視化---pygal模塊

pygal模塊

安裝pygal模塊

pygal模塊的安裝很是簡單,只需輸入一行pip命令便可html

pip install pygal

安裝完成:
json

pygal模塊介紹

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

柱狀圖

pygal柱狀圖官方文檔app

單列柱狀圖
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瀏覽器打開
多列柱狀圖svg

#添加數據
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折線圖官方文檔url

簡單折線圖
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')

效果圖:
3d

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

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

餅狀圖

pygal餅狀圖官方文檔code

簡單餅狀圖
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')

效果圖:
htm

多級餅狀圖
#添加數據
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官方文檔blog

基礎雷達圖
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模塊的瞭解,咱們知道這個模塊只能夠將整形的數字轉換成圖表格式。
因此咱們須要作的就是將每個數字提取出來,而且轉換成整形存入到列表中
因爲咱們想要提取的只是一等獎的獎金金額(由於2、三等獎的金額遠小於一等獎,不適合在圖表中觀察),因此這裏我加上了一個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()

實現結果

相關文章
相關標籤/搜索