Python画图

有的时候需要将数据进行可视化,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不再贴出,仅写出表头及测试数据供参考。
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值