Python散点图(Pandas + Matplotlib)实战--身高体重分布图

简单绘制一个散点图。

数据使用小朋友的身高和体重,简单看看。

数据结构:下面看一下其中几条的部分内容,我们只需要其中身高(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的取值范围我改了一下。

发现需求都是做着做着来的,现在又想到了,小朋友有男女之分。。。。

数据表里有性别的字段,取出来作为筛选分别绘制吧。



猜你喜欢

转载自blog.csdn.net/geanwen/article/details/78637705