简单绘制一个散点图。
数据使用小朋友的身高和体重,简单看看。
数据结构:下面看一下其中几条的部分内容,我们只需要其中身高(Height)和体重(Weight)列的数据:
共七万五千多条,下面看看通过pandas+matplotlib绘制出散点图。
注释写的很详细了,直接看代码很简单:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created 数据库数据导出excle 这里简单加载展示身高体重图 @author: ge """ import pandas as pd import matplotlib.pyplot as plt def main(): # 读取数据文件 df = pd.read_excel("../data/RT_TestResult.xls") # 取出身高和体重两列数据 height = df['Height'] weight = df['Weight'] plt.scatter(height, weight) # x,y取值范围设置 # 可以过滤掉一部分脏数据 plt.xlim(30, 160) plt.ylim(5, 50) plt.axis() # 设置title和x,y轴的label plt.title("Height And Weight") plt.xlabel("Height") plt.ylabel("Weight") # 保存图片到指定路径 plt.savefig("../data/HeightAndWeight.png") # 展示图片 *必加 plt.show() if __name__ == '__main__': main()
运行结果:
扫描二维码关注公众号,回复:
1570697 查看本文章
可以看到,图中最左面那个点,身高50cm的孩子20公斤有点夸张了。
代码中通过设置取值范围只能过滤掉一部分脏数据或者空数据。
七万多条数据出现小部分这种数据其实很正常,就需要我们手动的过滤或者填充,将数据清洗一遍。
最后散点可以围绕一条虚拟的线左右分布,或者聚集在一个固定范围内就正常了。
我简单的经过几个条件的筛选(我的数据都是3-6岁的小朋友):
- 1.身高不在50cm~180cm范围内的删除;
- 2.体重不在5kg~50kg范围内的就删除;
- 3.BMI指数小于10,大于30的删除;
注:BMI指数=体重/身高的平方,栗子:68kg/1.72^2;
BMI正常人(亚洲)是18.5-22.9;
我这里取的差距很大,因为是我自己实验;
经过筛选之后代码变成如下,代码注释我写的很全了,就不在啰嗦解说了:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created 数据库数据导出excle 这里简单加载展示身高体重图 @author: ge """ import numpy as np import pandas as pd import matplotlib.pyplot as plt def main(): # 读取数据文件 data = pd.DataFrame(pd.read_excel("../data/RT_TestResult.xls")) # 如果有空值 就将这一行删除 data.dropna() # 取出身高体重两列构成新的dataFrame data = data[['Height', 'Weight']] # 判断异常数据就删除 for i in range(data.index.max()): # 过滤条件设置 if any([ # 身高范围不在50cm到180cm的 data.loc[i, 'Height'] < 50 or data.loc[i, 'Height'] > 180, # 体重范围不在5kg到50kg的 data.loc[i, 'Weight'] < 5 or data.loc[i, 'Weight'] > 50, # BMI过偏 data.loc[i, 'Weight'] / ((data.loc[i, 'Height'] * data.loc[i, 'Height']) / 10000) < 10 or data.loc[i, 'Weight'] / ((data.loc[i, 'Height'] * data.loc[i, 'Height']) / 10000) > 30 ]): print('删除异常值 %s 行数据' % i) data.drop([i], inplace=True) # 绘制散点图 plt.scatter(data['Height'], data['Weight']) # x,y轴取值范围设置 plt.xlim(0, 160) plt.ylim(0, 60) plt.axis() # 设置title和x,y轴的label plt.title("Height And Weight") plt.xlabel("Height") plt.ylabel("Weight") # 保存图片到指定路径 plt.savefig("../data/HeightAndWeight.png") # 展示图片 *必加 plt.show() if __name__ == '__main__': main()
简单的筛选就完成了。
注:筛选的x,y的取值范围我改了一下。
发现需求都是做着做着来的,现在又想到了,小朋友有男女之分。。。。
数据表里有性别的字段,取出来作为筛选分别绘制吧。