Python数据可视化---pygal模块
<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>pygal模块<ul><li>安装pygal模块</li><li>pygal模块介绍<ul><li>柱状图<ul><li>单列柱状图</li><li>堆叠柱状图</li><li>横向柱状图</li></ul></li><li>折线图<ul><li>简单折线图</li><li>纵向折线图</li><li>堆叠折线图</li></ul></li><li>饼状图<ul><li>简单饼状图</li><li>多级饼状图</li><li>圆环图</li><li>半圆图</li></ul></li><li>雷达图<ul><li>基础雷达图</li></ul></li></ul></li><li>其他图表介绍</li></ul></li><li>爬取中国福彩网彩票数据并以图表形式显示<ul><li>网页分析</li><li>数据提取</li><li>转换数据</li><li>将数据转换成图表</li><li>完整代码</li><li>实现结果</li></ul></li></ul></div><p></p><h2 id="pygal模块">pygal模块</h2>
<h3 id="安装pygal模块">安装pygal模块</h3>
<p>pygal模块的安装非常简单,只需输入一行pip命令即可</p>
<pre><code>pip install pygal
</code></pre>
<p>安装完成:<br>
<img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200419224758992-598851840.png" alt="" loading="lazy"></p>
<h3 id="pygal模块介绍">pygal模块介绍</h3>
<p>pygal官网地址<br>
pygal是Python的第三方库,他的主要功能就是数据可视化,即将数字转化成图表的形式来呈现,它提供的图表样式有柱状图、折线图、饼状图、雷达图......</p>
<h4 id="柱状图">柱状图</h4>
<p>pygal柱状图官方文档</p>
<h5 id="单列柱状图">单列柱状图</h5>
<pre><code>import pygal
view = pygal.Bar()
#图表名
view.title = '柱状图'
#添加数据
view.add('numbers', )
#在浏览器中查看
#view.render_in_browser()
#保存为view.svg(也可以保存为jpg)
view.render_to_file('view.svg')
</code></pre>
<p>效果图:<br>
<img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200419233125318-1773289848.png" alt="" loading="lazy"><br>
<font color="red">注意:svg图片用系统自带的图片查看器打开可能会显示全黑色,可以尝试使用Google浏览器打开</font><br>
多列柱状图</p>
<pre><code>#添加数据
view.add('numbers', )
view.add('numbers_2', )
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200419233508006-1397780072.png" alt="" loading="lazy"></p>
<h5 id="堆叠柱状图">堆叠柱状图</h5>
<pre><code>view = pygal.StackedBar()
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200419235331021-1081916941.png" alt="" loading="lazy"></p>
<h5 id="横向柱状图">横向柱状图</h5>
<pre><code>view = pygal.HorizontalStackedBar()
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200419233813089-913895710.png" alt="" loading="lazy"></p>
<h4 id="折线图">折线图</h4>
<p>pygal折线图官方文档</p>
<h5 id="简单折线图">简单折线图</h5>
<pre><code>import pygal
view = pygal.Line()
#图表名
view.title = '折线图'
#添加数据
view.add('numbers', )
view.add('numbers_2', )
#在浏览器中查看
#view.render_in_browser()
#保存为view.svg(也可以保存为jpg)
view.render_to_file('view.svg')
</code></pre>
<p>效果图:<br>
<img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200419234805202-1425423449.png" alt="" loading="lazy"></p>
<h5 id="纵向折线图">纵向折线图</h5>
<pre><code>view = pygal.HorizontalLine()
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200419234935501-2103983264.png" alt="" loading="lazy"></p>
<h5 id="堆叠折线图">堆叠折线图</h5>
<pre><code>view = pygal.StackedLine(fill=True)
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200419235105361-992460179.png" alt="" loading="lazy"></p>
<h4 id="饼状图">饼状图</h4>
<p>pygal饼状图官方文档</p>
<h5 id="简单饼状图">简单饼状图</h5>
<pre><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')
</code></pre>
<p>效果图:<br>
<img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200420000436161-1900161650.png" alt="" loading="lazy"></p>
<h5 id="多级饼状图">多级饼状图</h5>
<pre><code>#添加数据
view.add('A', )
view.add('B', )
view.add('C', )
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200420000730251-191735563.png" alt="" loading="lazy"></p>
<h5 id="圆环图">圆环图</h5>
<pre><code>#设置空心圆半径
view = pygal.Pie(inner_radius=0.4)
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200420001010605-948794203.png" alt="" loading="lazy"></p>
<h5 id="半圆图">半圆图</h5>
<pre><code>view = pygal.Pie(half_pie=True)
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200420001141901-362043494.png" alt="" loading="lazy"></p>
<h4 id="雷达图">雷达图</h4>
<p>pygal官方文档</p>
<h5 id="基础雷达图">基础雷达图</h5>
<pre><code>import pygal
view = pygal.Radar()
#图表名
view.title = '雷达图'
#添加数据(可以为任意个)
view.add('A', )
view.add('B', )
view.add('C', )
#保存为view.svg(也可以保存为jpg)
view.render_to_file('view.svg')
</code></pre>
<p>效果图:<br>
<img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200420001716742-1805726616.png" alt="" loading="lazy"></p>
<h3 id="其他图表介绍">其他图表介绍</h3>
<p>直方图<br>
盒子图<br>
圆点图<br>
坐标图<br>
锥形图<br>
环状图<br>
仪表图<br>
塔形图<br>
树图<br>
地图</p>
<h2 id="爬取中国福彩网彩票数据并以图表形式显示">爬取中国福彩网彩票数据并以图表形式显示</h2>
<h3 id="网页分析">网页分析</h3>
<p>首先打开中国福彩网,点击双色球,选择往期开奖栏目<br>
进入栏目后,选定往期的奖金数目作为我们想要爬取的目标内容<br>
<img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200419205023147-391174530.png" alt="" loading="lazy"></p>
<p>明确目标后,开始寻找数据所在的位置<br>
鼠标右击页面,打开网页源代码,在源代码中搜索是否存在奖金金额数目<br>
<img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200419205426486-1990450707.png" alt="" loading="lazy"></p>
<p>搜索过后,发现这个金额数据没有在网页的源代码中,所以想到用抓包的方式来尝试获取这些金额数据<br>
右击检查,选择network选项卡,按下ctrl+r键刷新界面,开始捕捉数据包<br>
在过滤掉一些png、jpg的数据包之后,我们锁定了一个以<font color="red">findDrawNotice</font>开头的数据包,打开观察数据包的内容,发现这个正是我们想要抓取的数据包<br>
<img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200419210959587-498357956.png" alt="" loading="lazy"></p>
<p><img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200419210436417-1232399063.png" alt="" loading="lazy"></p>
<p><img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200419210448024-1831990999.png" alt="" loading="lazy"><br>
现在已经找到了想要抓包的内容,现在可以开始着手写代码了</p>
<h3 id="数据提取">数据提取</h3>
<p>我们分析过网页之后,选定了要抓取的数据包,开始使用requests请求来获取数据</p>
<pre><code>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
</code></pre>
<p>这个网页可能会有一个小的反爬措施,于是我们就在headers中加入user-agent和referer两个头信息<br>
我们使用print语句来打印一下response的内容<br>
<img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200419211437092-1643372430.png" alt="" loading="lazy"></p>
<p>print之后会发现这个内容是以字符串的格式打印出来的,如果我们想从中提取数据,则必须将它转换成字典的格式</p>
<pre><code>data_json = json.loads(response) #将数据转换为json格式
</code></pre>
<p>将数据转换之后,我们就可以使用键值对的方式来提取我们想要的数据了</p>
<pre><code>datas = data_json["result"]
for data in datas:
prizegrades = data["prizegrades"] #包含中奖金额的字典提取
for item in prizegrades:
print(item)
typemoney = item['typemoney'] #中奖金额提取
print(typemoney)
</code></pre>
<p>这里我们尝试着逐层提取彩票的奖金信息,提取到最近的一层时,将数据打印出来分析数据<br>
<img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200419213252304-803200815.png" alt="" loading="lazy"></p>
<p>可以看到前三个和我们想要提取的数据内容是一致的,这些type后面的数字指的是奖金的等级,就是说对应到的号码是多少就是几等奖<br>
到此为止,我们已经将需要获取的中奖金额提取出来了</p>
<h3 id="转换数据">转换数据</h3>
<p>等我们看到这些数据的时候,虽然看到的是数字形式,但是他的数据类型确是字符形,通过此前对pygal模块的了解,我们知道这个模块只可以将<font color="red">整形</font>的数字转换成图表格式。<br>
所以我们需要做的就是将每一个数字提取出来,并且转换成整形存入到列表中<br>
由于我们想要提取的只是一等奖的奖金金额(因为二、三等奖的金额远小于一等奖,不适合在图表中观察),所以这里我加上了一个if语句判断</p>
<pre><code>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))
</code></pre>
<p>但是我在运行这段代码的时候会提示错误,经过我的一番疯狂分析(百度求助),发现出错的原因是在提取奖金的时候会出现下划线和空字符串的干扰,而int转换数据类型则只能装换纯数字组成的字符串,所以转换的过程中会报错。但是这并不是一个大问题,我们只需要写一个if语句来跳过非法字符串就可以解决了,下面是正确的代码:</p>
<pre><code>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)
</code></pre>
<p>观察输出:<br>
<img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200419220719559-339613767.png" alt="" loading="lazy"></p>
<h3 id="将数据转换成图表">将数据转换成图表</h3>
<pre><code>#设置图表样式为柱状图
view = pygal.Bar()
#图表名
view.title = '奖金金额(¥)'
#将数据填入图表
view.add('money',money_list)
#在浏览器中显示图表
view.render_in_browser()
</code></pre>
<h3 id="完整代码">完整代码</h3>
<pre><code class="language-import">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()
</code></pre>
<h3 id="实现结果">实现结果</h3>
<p><img src="https://img2020.cnblogs.com/blog/1971945/202004/1971945-20200420003520502-1345885488.png" alt="" loading="lazy"></p><br><br>
来源:https://www.cnblogs.com/cherish-hao/p/12734554.html
頁:
[1]