基于爬取百合网的数据,用matplotlib生成图表
爬取百合网的数据链接:http://www.cnblogs.com/YuWeiXiF/p/8439552.html
总共爬了22779条数据。第一次接触matplotlib库,以下代码参考了matplotlib官方文档:https://matplotlib.org/users/index.html。
数据查询用到了两个方法:getSexNumber(@sex varchar(2),@income varchar(30))、gethousingNumber(@sex varchar(2),@housing varchar(6))来简化查询语句的长度,代码如下:
go
create function getSexNumber(@sex varchar(),@income varchar())
returns int
as
begin
return(select count(id) from users where sex = @sex and income = @income)
end
go
go
create function gethousingNumber(@sex varchar(),@housing varchar())
returns int
as
begin
return(select count(id) from users where sex = @sex and housing = @housing)
end
go
以下代码为SQL Server 数据库操作:
#__author: "YuWei"
#__date: 2018/2/11
import numpy as np
import matplotlib.pyplot as plt
import pymssql def db(sql):
"""
数据库相关操作 :param sql: sql语句
:return: 查询的结果集,list封装
"""
conn = pymssql.connect(host='localhost', user='sa', password='123456c', database='Baihe', charset="utf8")
cur = conn.cursor()
cur.execute(sql)
row = cur.fetchone() # 指向结果集的第一行,
data = [] # 返回的list
while row:
rows = list(row)
for i in range(len(rows)): # 针对rows的每项编码
try:
rows[i] = rows[i].encode('latin-1').decode('gbk')
except AttributeError:pass
data.append(rows) # 向data加数据
row = cur.fetchone() #
print(data)
cur.close()
conn.close()
return data
生成各工资段人数占总人数比图:
def builder_income_ratio():
"""
生成各工资段人数占总人数比图 :return: 无
"""
data_list = db("select income,count(id) from users group by income")
income_data_list = [] # 数据
income_labels_list = [] # 图例
for data in data_list:
income_data_list.append(data[1])
income_labels_list.append(data[0])
income_data_list.remove(income_data_list[6]) # 删掉不要的数据
income_labels_list.remove(income_labels_list[6]) # 删掉不要的数据
# 画饼图
plt.pie(income_data_list,labels=income_labels_list,colors=['c','m','r','g'],startangle=30,
shadow=True,explode=(0, 0, 0.1, 0, 0, 0, 0.1, 0, 0.1, 0, 0, 0),autopct='%.1f%%')
plt.title('各工资段人数占总人数比') # 标题
plt.show() # 显示
执行效果如下:
生成各工资段男,女人数图:
def builder_sex_ratio():
"""
生成各工资段男,女人数图 :return: 无
"""
data_list = db("select income,dbo.getSexNumber('男',income) as 男 ,dbo.getSexNumber('女',income) as 女 "
"from users group by income")
men = [] # 男
women = [] # 女
labels =[] # 图例
for data in data_list:
labels.append(data[0])
men.append(data[1])
women.append(data[2])
men.remove(men[6]) # 删掉不要的数据
women.remove(women[6]) # 删掉不要的数据
labels.remove(labels[6]) # 删掉不要的数据
max_line = 12 # 12个
fig,ax = plt.subplots()
line = np.arange(max_line) # [0,1,2,3,4,5,6,7,8,9,10,11]
bar_width = 0.4 # 条形之间的宽度
# 画条形图
ax.bar(line, men, bar_width,alpha=0.3, color='b',label='男')
ax.bar(line+bar_width, women, bar_width,alpha=0.3, color='r',label='女')
ax.set_xlabel('工资段')
ax.set_ylabel('人数')
ax.set_title('各工资段男,女人数图')
ax.set_xticks(line + bar_width / 2) # 保证条形居中
ax.set_xticklabels(labels)
# 画两条线
plt.plot([0.04, 1.04, 2.04, 3.04, 4.04, 5.04, 6.04, 7.04, 8.04, 9.04, 10.04, 11.04], men, label='男')
plt.plot([0.4, 1.4, 2.4, 3.4, 4.4, 5.4, 6.4, 7.4, 8.4, 9.4, 10.4, 11.4], women, label='女')
ax.legend()
fig.tight_layout()
# fig.savefig("1.png") # 生成图片
plt.show()
执行效果如下:
生成男,女平均身高图:
def builder_age_ratio():
"""
生成男,女平均身高图 :return:
"""
data_list = db("select sex,avg(height) as 平均升高 from users group by sex")
sex = [] # 性别
number = [] # 人数
for data in data_list:
sex.append(data[0])
number.append(data[1])
# 画条形图
plt.bar(sex[0], number[0], label="男", color='g',width=0.03)
plt.bar(sex[1], number[1], label="女", color='r',width=0.03)
plt.legend()
plt.xlabel('性别')
plt.ylabel('身高')
plt.title('男女平均身高图')
plt.show()
执行效果如下:
生成有房与无房的人数比例图:
def builder_housing_sum_ratio():
"""
生成有房与无房的人数比例图 :return:
"""
data_list = db("select housing,count(id) from users group by housing")
housing_data_list = []
housing_labels_list = []
for data in data_list:
housing_data_list.append(data[1])
housing_labels_list.append(data[0])
# 画饼图
plt.pie(housing_data_list, labels=housing_labels_list, colors=['g', 'r'], startangle=30,
shadow=True, explode=(0, 0), autopct='%.0f%%')
plt.title('有房与无房的人数比例图')
plt.show()
执行效果如下:
生成有无房男女人数图:
def builder_housing_ratio():
"""
生成有无房男女人数图 :return:
"""
data_list = db("select dbo.gethousing('女',housing),dbo.gethousing('男',housing) from users group by housing")
homey = [] # 有房
homem = [] # 无房
for data in data_list:
homey.append(data[0])
homem.append(data[1])
max_line = 2 # 两个
fig, ax = plt.subplots()
line = np.arange(max_line) # [0,1]
bar_width = 0.1 # 条形之间的宽度
# 画条形
ax.bar(line,homey , bar_width, alpha=0.3,color='b',label='女')
ax.bar(line+bar_width, homem, bar_width,alpha=0.3,color='r',label='男')
ax.set_xlabel('有无房')
ax.set_ylabel('人数')
ax.set_title('有无房男女人数图')
ax.set_xticks(line + bar_width / 2) # 保持居中
ax.set_xticklabels(['有房','无房'])
ax.legend()
fig.tight_layout()
plt.show()
执行效果如下:
基于爬取百合网的数据,用matplotlib生成图表的更多相关文章
- 爬虫入门(四)——Scrapy框架入门:使用Scrapy框架爬取全书网小说数据
为了入门scrapy框架,昨天写了一个爬取静态小说网站的小程序 下面我们尝试爬取全书网中网游动漫类小说的书籍信息. 一.准备阶段 明确一下爬虫页面分析的思路: 对于书籍列表页:我们需要知道打开单本书籍 ...
- 使用python抓取婚恋网用户数据并用决策树生成自己择偶观
最近在看<机器学习实战>的时候萌生了一个想法,自己去网上爬一些数据按照书上的方法处理一下,不仅可以加深自己对书本的理解,顺便还可以在github拉拉人气.刚好在看决策树这一章,书里面的理论 ...
- python3 爬取百合网的女人们和男人们
学Python也有段时间了,目前学到了Python的类.个人感觉Python的类不应称之为类,而应称之为数据类型,只是数据类型而已!只是数据类型而已!只是数据类型而已!重要的事情说三篇. 据书上说一个 ...
- Python爬虫 爬取百合网的女人们和男人们
学Python也有段时间了,目前学到了Python的类.个人感觉Python的类不应称之为类,而应称之为数据类型,只是数据类型而已!只是数据类型而已!只是数据类型而已!重要的事情说三篇. 据书上说一个 ...
- 实例学习——爬取豆瓣网TOP250数据
开发环境:(Windows)eclipse+pydev 网址:https://book.douban.com/top250?start=0 from lxml import etree #解析提取数据 ...
- 使用python爬取东方财富网机构调研数据
最近有一个需求,需要爬取东方财富网的机构调研数据.数据所在的网页地址为: 机构调研 网页如下所示: 可见数据共有8464页,此处不能直接使用scrapy爬虫进行爬取,因为点击下一页时,浏览器只是发起了 ...
- 八爪鱼采集器︱爬取外网数据(twitter、facebook)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 要想采集海外数据有两种方式:云采集+单机采集. ...
- [转]使用python爬取东方财富网机构调研数据
最近有一个需求,需要爬取东方财富网的机构调研数据.数据所在的网页地址为: 机构调研 网页如下所示: 可见数据共有8464页,此处不能直接使用scrapy爬虫进行爬取,因为点击下一页时,浏览器只是发起了 ...
- Python爬虫之爬取慕课网课程评分
BS是什么? BeautifulSoup是一个基于标签的文本解析工具.可以根据标签提取想要的内容,很适合处理html和xml这类语言文本.如果你希望了解更多关于BS的介绍和用法,请看Beautiful ...
随机推荐
- svn过滤文件配置
---恢复内容开始--- 在 在输入框中输入这个即可..... .classpath .project .springBeans *.class *.o *.lo *.la *.al .libs *. ...
- [转载]织梦CMS首页调用分类信息栏目及列表方法
原文地址:织梦CMS首页调用分类信息栏目及列表方法作者:小武哥 不懂代码,搜索学习一晚上,都是说调用特定栏目分类信息列表的,用这个代码 {dede:arclistsg row='10' titlele ...
- PHP操作MySQL对表增加一列(一个字段)
2014-03-19 16:59 1471人阅读 评论(0) 收藏 举报 分类: MySQL(12) 对于已经建立好的数据库,在一个已经有字段的表内新加字段可用以下方法: mysql_query(&q ...
- 如何控制input框!
ENTER键可以让光标移到下一个输入框 只能是中文 屏蔽输入法 只能输入英文和数字 只能是数字 只能显示,不能修改 只能输数字,判断按键的值 function onlyNum() { ...
- 为什么选择.NETCore?
为什么.NETCore? 学习新的开发框架是一项巨大的投资.您需要学习如何在新框架中编写,构建,测试,部署和维护应用程序.作为开发人员,有许多框架可供选择,很难知道什么是最适合的工作.即使您正在使用. ...
- 实现鼠标hover动画效果自己理解的两种方法——练习笔记
练习前端技术学院的任务,需要实现"导航栏中的链接,随着鼠标悬浮的位置,相应的链接下出现红色线段"的效果(如图1),我的理解有简易与稍显复杂一些的方法: 首先想到的就是直接利用伪元素 ...
- Spring @Scheduled 在tomcat容器里面执行两次
今天在用spring里面的@Scheduled执行定时任务,但是发现到触发定时任务的时间点总会执行两次.原因是修改了tomcat conf包下面的server.xml文件导致的.配置如下: <H ...
- 《UNIX实用教程》读书笔记
原著:<Just Enough UNIX> Fifth Edition [美]Paul K.Andersen 译著:<UNIX实用教程> 第5版 宋虹 曾庆冬 段桂华 杨路 ...
- Linux平台ORACLE INSTANT客户端安装
下载安装文件 先去ORACLE官方网站下载所需版本的Instant Client Package 和 Instant Client Package - SQL*Plus安装包,(千万注意版本) htt ...
- 了解ViewFlipper工作机制
平时我们在使用ViewFlipper的时候一方面感叹ViewFlipper的使用很简单,另一方面,我们时常感叹ViewFlipper给我们的接口方法太少,很多常用的效果都不好做,很难施展拳脚,这篇文章 ...