Python数据可视化---pygal模块
pygal模块
安装pygal模块
pygal模块的安装非常简单,只需输入一行pip命令即可
pip install pygal
安装完成:
pygal模块介绍
pygal官网地址
pygal是Python的第三方库,他的主要功能就是数据可视化,即将数字转化成图表的形式来呈现,它提供的图表样式有柱状图、折线图、饼状图、雷达图......
柱状图
单列柱状图
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()
折线图
简单折线图
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)
饼状图
简单饼状图
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)
雷达图
基础雷达图
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()