有的时候需要将数据进行可视化,python画图是一个不错的选择。现在需要分析学校新生的男女比例以及出生年份分布,我选择分别使用饼图和柱状图来描述。
code-1 饼图,新生男女比例
# coding:utf-8
# 读取csv数据进行可视化分析,分析新生男女比例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from collections import Counter
# 注意磁盘目录最好写成/,如果是\可能会引起解释错误
# 数据库导出excle的时候最好导出成xlsx(2007版本之后的)格式,xls格式运行错误
file = 'F:/python数据分析/测试数据/2017allstu.xlsx'
# 读取csv文件
df = pd.read_excel(file)
# 输出前10行
# print(df.head(10))
# print(df)
# print(type(df))
# loc返回的是列标签+行数据,['标签名']列标签数据
y = df.loc[:]['XB']
# 将获取到的列数据转换成list
# print(y.tolist())
# 将存有性别的列表转化为字典
sex = Counter(y.tolist())
print('男生人数:%d' % sex.get(1)) # 根据键获取字典中的值
print('女生人数:%d' % sex.get(2))
# 添加文本内容
plt.text(-1.32208, -0.445, '%d' % sex.get(1))
plt.text(1.13444, 0.403213, '%d' % sex.get(2))
# 定义饼状图的标签,标签是列表
labels = [u'男', '女']
# 定义数值
sizes = [sex.get(1), sex.get(2)]
colors = ['yellowgreen', 'lightskyblue']
# 设置画图中文显示字体
# plt.rcParams['font.sans-serif'] = ['SimHei']
plt.title(u'中原工学院2017届新生男女比例')
patches, l_text, p_text = plt.pie(sizes, labels=labels, colors=colors,
labeldistance=1.1, autopct='%3.1f%%', shadow=False,
startangle=90, pctdistance=0.6)
# 改变文本的大小
# 方法是把每一个text遍历。调用set_size方法设置它的属性
for t in l_text:
t.set_size = (30)
for t in p_text:
t.set_size = (20)
# 设置x,y轴刻度一致,这样饼图才能是圆的
plt.axis('equal')
plt.legend()
plt.show()
显示效果:
code-2 分析新生出生年份分布
# coding:utf-8
# 统计新生年龄段
import pandas as pd
import numpy as np
from collections import Counter
import matplotlib.pyplot as plt
file = 'F:/python数据分析/测试数据/2017allstu.xlsx'
# 返回解析excle的结果
df = pd.read_excel(file)
# 获得新生所有的出生日期
birthdays = df.loc[:]['CSRQ']
# 使用numpy获取出生日期的年份,返回的是列表
bdl = np.array(birthdays, dtype='datetime64[Y]')
# 统计列表中年份出现个数,以字典形式返回
years = Counter(bdl)
# 根据key升序排列,返回的是一个列表
# dict.items() 函数以列表返回可遍历的(键, 值) 元组数组
# key=lambda asd: asd[0] 定义匿名表达式,参数是asd(遍历列表所得),返回值是asd[0]也就是键(asd[1]是值)
# reverse表示排序方式,False正序(默认),True反序
dic = sorted(years.items(), key=lambda asd: asd[0], reverse=False)
# 将已排序列表包含的元组进行分离
yob = [] # 出生年份
num = [] # 该年人数
for key, value in dic:
yob.append(key)
num.append(value)
# range(len(yob))表示很横坐标的范围,num表示柱状图数值,tick_label表示横坐标标签
plt.bar(range(len(yob)), num, tick_label=yob)
plt.title(u'中原工学院2017届新生出生年份柱状图')
plt.show()
显示效果:
总结:
1、数据获取(重点)
python从文本中读取数据,文本形式多样(.csv、.xlsx、txt等),注意文本字符编码,读取之后的数据量是否准确。
2、数据处理
获取到数据之后需要经过一系列处理才能,将需要的数据用到画图的参数中,在上面的例子中感觉对日期、时间类型的处理复杂。需要列表、字典、集合、元组、字符串的基础知识。
此外需要使用一些外部的模块:numpy、pandas、matplotlib、collections等,需要了解一些关键函数的使用方法(参数及返回值)。上面贴出的代码关键部分都有详细解释,可以学习参考。
注:由于数据私密性问题,2017allstu.xlsx不再贴出,仅写出表头及测试数据供参考。