简单绘制一个散点图。
数据使用小朋友的身高和体重,简单看看。
数据结构:下面看一下其中几条的部分内容,我们只需要其中身高(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()
运行结果:
可以看到,图中最左面那个点,身高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的取值范围我改了一下。
发现需求都是做着做着来的,现在又想到了,小朋友有男女之分。。。。
数据表里有性别的字段,取出来作为筛选分别绘制吧。