Python画图

来源:互联网 发布:启发式算法应用案例 编辑:程序博客网 时间:2024/06/05 07:29

有的时候需要将数据进行可视化,python画图是一个不错的选择。现在需要分析学校新生的男女比例以及出生年份分布,我选择分别使用饼图和柱状图来描述。

code-1 饼图,新生男女比例

# coding:utf-8# 读取csv数据进行可视化分析,分析新生男女比例import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom 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 pdimport numpy as npfrom collections import Counterimport matplotlib.pyplot as pltfile = '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不再贴出,仅写出表头及测试数据供参考。
这里写图片描述

原创粉丝点击