码迷,mamicode.com
首页 > 其他好文 > 详细

基于爬取百合网的数据,用matplotlib生成图表

时间:2018-02-12 23:39:33      阅读:311      评论:0      收藏:0      [点我收藏+]

标签:删掉   server   src   https   img   长度   lis   数据库操作   之间   

爬取百合网的数据链接: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))来简化查询语句的长度,代码如下:

 1 go
 2 create function getSexNumber(@sex varchar(2),@income varchar(30))
 3 returns int
 4 as
 5 begin
 6     return(select count(id) from users where sex = @sex and income = @income)
 7 end
 8 go
 9 go
10 create function gethousingNumber(@sex varchar(2),@housing varchar(6))
11 returns int
12 as
13 begin
14     return(select count(id) from users where sex = @sex and housing = @housing)
15 end
16 go

 以下代码为SQL Server 数据库操作:

 1 #__author: "YuWei"
 2 #__date: 2018/2/11
 3 import numpy as np
 4 import matplotlib.pyplot as plt
 5 import pymssql
 6 
 7 def db(sql):
 8     """
 9     数据库相关操作
10 
11     :param sql: sql语句
12     :return: 查询的结果集,list封装
13     """
14     conn = pymssql.connect(host=localhost, user=sa, password=123456c, database=Baihe, charset="utf8")
15     cur = conn.cursor()
16     cur.execute(sql)
17     row = cur.fetchone() # 指向结果集的第一行,
18     data = [] # 返回的list
19     while row:
20         rows = list(row)
21         for i in range(len(rows)): # 针对rows的每项编码
22             try:
23                 rows[i] = rows[i].encode(latin-1).decode(gbk)
24             except AttributeError:pass
25         data.append(rows) # 向data加数据
26         row = cur.fetchone() #
27     print(data)
28     cur.close()
29     conn.close()
30     return data
生成各工资段人数占总人数比图:
 1 def builder_income_ratio():
 2     """
 3     生成各工资段人数占总人数比图
 4 
 5     :return: 无
 6     """
 7     data_list = db("select income,count(id) from users group by income")
 8     income_data_list = [] # 数据
 9     income_labels_list = [] # 图例
10     for data in data_list:
11         income_data_list.append(data[1])
12         income_labels_list.append(data[0])
13     income_data_list.remove(income_data_list[6]) # 删掉不要的数据
14     income_labels_list.remove(income_labels_list[6]) # 删掉不要的数据
15     # 画饼图
16     plt.pie(income_data_list,labels=income_labels_list,colors=[c,m,r,g],startangle=30,
17             shadow=True,explode=(0, 0, 0.1, 0, 0, 0, 0.1, 0, 0.1, 0, 0, 0),autopct=%.1f%%)
18     plt.title(各工资段人数占总人数比) # 标题
19     plt.show() # 显示

 

执行效果如下:

技术分享图片

生成各工资段男,女人数图:

 1 def builder_sex_ratio():
 2     """
 3     生成各工资段男,女人数图
 4 
 5     :return: 无
 6     """
 7     data_list = db("select income,dbo.getSexNumber(‘男‘,income) as 男 ,dbo.getSexNumber(‘女‘,income) as 女 "
 8                     "from users group by income")
 9     men = [] #
10     women = [] #
11     labels =[] # 图例
12     for data in data_list:
13         labels.append(data[0])
14         men.append(data[1])
15         women.append(data[2])
16     men.remove(men[6]) # 删掉不要的数据
17     women.remove(women[6]) # 删掉不要的数据
18     labels.remove(labels[6]) # 删掉不要的数据
19     max_line = 12 # 12个
20     fig,ax = plt.subplots()
21     line = np.arange(max_line) # [0,1,2,3,4,5,6,7,8,9,10,11]
22     bar_width = 0.4 # 条形之间的宽度
23     # 画条形图
24     ax.bar(line, men, bar_width,alpha=0.3, color=b,label=)
25     ax.bar(line+bar_width, women, bar_width,alpha=0.3, color=r,label=)
26     ax.set_xlabel(工资段)
27     ax.set_ylabel(人数)
28     ax.set_title(各工资段男,女人数图)
29     ax.set_xticks(line + bar_width / 2) # 保证条形居中
30     ax.set_xticklabels(labels)
31     # 画两条线
32     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=)
33     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=)
34     ax.legend()
35     fig.tight_layout()
36     # fig.savefig("1.png") # 生成图片
37     plt.show()

 

执行效果如下:

技术分享图片

生成男,女平均身高图:

 1 def builder_age_ratio():
 2     """
 3     生成男,女平均身高图
 4 
 5     :return:
 6     """
 7     data_list = db("select sex,avg(height) as 平均升高 from users group by sex")
 8     sex = [] # 性别
 9     number = [] # 人数
10     for data in data_list:
11         sex.append(data[0])
12         number.append(data[1])
13     # 画条形图
14     plt.bar(sex[0], number[0], label="", color=g,width=0.03)
15     plt.bar(sex[1], number[1], label="", color=r,width=0.03)
16     plt.legend()
17     plt.xlabel(性别)
18     plt.ylabel(身高)
19     plt.title(男女平均身高图)
20     plt.show()

 

执行效果如下:

技术分享图片

生成有房与无房的人数比例图:

 1 def builder_housing_sum_ratio():
 2     """
 3     生成有房与无房的人数比例图
 4 
 5     :return:
 6     """
 7     data_list = db("select housing,count(id) from users group by housing")
 8     housing_data_list = []
 9     housing_labels_list = []
10     for data in data_list:
11         housing_data_list.append(data[1])
12         housing_labels_list.append(data[0])
13     # 画饼图
14     plt.pie(housing_data_list, labels=housing_labels_list, colors=[g, r], startangle=30,
15             shadow=True, explode=(0, 0), autopct=%.0f%%)
16     plt.title(有房与无房的人数比例图)
17     plt.show()

 

执行效果如下:

技术分享图片

生成有无房男女人数图:

 1 def builder_housing_ratio():
 2     """
 3     生成有无房男女人数图
 4 
 5     :return:
 6     """
 7     data_list = db("select dbo.gethousing(‘女‘,housing),dbo.gethousing(‘男‘,housing) from users group by housing")
 8     homey = [] # 有房
 9     homem = [] # 无房
10     for data in data_list:
11         homey.append(data[0])
12         homem.append(data[1])
13     max_line = 2 # 两个
14     fig, ax = plt.subplots()
15     line = np.arange(max_line) # [0,1]
16     bar_width = 0.1 # 条形之间的宽度
17     # 画条形
18     ax.bar(line,homey , bar_width, alpha=0.3,color=b,label=)
19     ax.bar(line+bar_width, homem, bar_width,alpha=0.3,color=r,label=)
20     ax.set_xlabel(有无房)
21     ax.set_ylabel(人数)
22     ax.set_title(有无房男女人数图)
23     ax.set_xticks(line + bar_width / 2) # 保持居中
24     ax.set_xticklabels([有房,无房])
25     ax.legend()
26     fig.tight_layout()
27     plt.show()

 

执行效果如下:

技术分享图片

基于爬取百合网的数据,用matplotlib生成图表

标签:删掉   server   src   https   img   长度   lis   数据库操作   之间   

原文地址:https://www.cnblogs.com/YuWeiXiF/p/8445749.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!