Bootstrap

实验十一 数据分析与可视化

实验十一 数据分析与可视化

一、实验学时:2学时

二、实验目的

  1. 掌握pandas的read_csv函数
  2. 掌握并使用matplotlib.pyplot中plot函数以及各个参数用法
  3. 掌握并使用matplotlib.pyplot中scatter函数以及各个参数用法
  4. 掌握并使用matplotlib.pyplot中pie函数以及各个参数用法
  5. 掌握并使用matplotlib.pyplot中bar函数以及各个参数用法
  6. 查阅并使用matplotlib.pyplot中直方图函数以及各个参数用法

三、实验内容

  1. 利用pandas读取以下链接的csv,并保存对象为变量名“df”: (https://pynative.com/wp-content/uploads/2019/01/company_sales_data.csv)
  • 提示: Pandas不能直接读取string,而只能读取文件对象。例如,文件对象可以利用以下代码抓取并生成:
  • import requests, io
  • response=requests.get(‘YOUR_LINK’)
  • file_object = io.StringIO(response.content.decode(‘utf-8’))
  1. 读取所有月份的总利润并使用折线图显示。折线图应如下所示:

图片描述

  1. 获取所有月份的总利润并显示具有以下样式属性的折线图。折线图应如下所示:

图片描述

  1. 读取所有产品销售数据并使用多线图显示。即,每个产品的单独一条线。该图应如下所示:

图片描述

  1. 读取每个月的牙膏销售数据并使用散点图显示。此外,在图中添加一个网格。网格线样式应为“-”。散点图应如下所示:

图片描述

  1. 读取面霜和洗面奶产品销售数据并使用条形图显示。条形图应显示每个产品每月售出的单位数量。条形图应如下所示:

图片描述

  1. 读取所有月份的沐浴皂销售数据并使用条形图显示,最后将此图保存到硬盘(路径为:D:\7.png,dpi为150)。条形图应如下所示:

图片描述

  1. 计算每种产品去年的总销售数据并使用饼图显示。注意:在饼图中显示每种产品每年售出的单位数量百分比。饼图应如下所示:

图片描述

  1. 阅读所有月份的沐浴皂洗面奶并使用子图显示它。子图应如下所示:

图片描述

  1. 请查阅关于直方图的资料(plt.hist)。之后读取每个月的总利润并使用直方图显示(横轴为利润范围)。直方图应如下所示:

图片描述

四、实验结果

  1. 利用pandas读取以下链接的csv,并保存对象为变量名“df”: (https://pynative.com/wp-content/uploads/2019/01/company_sales_data.csv)

    题目思路:利用pandas读取文件对象,然后将对象输出为csv格式文件之后使用进行读取即可。

    程序代码:

    """
    程序名:实验11.1.py
    功能:利用pandas读取以下链接的csv,并保存对象为变量名“df”
    日期:2022.6.13
    版本:1.0
    """
    import requests
    import io
    import pandas as pd
    response=requests.get('https://pynative.com/wp-content/uploads/2019/01/company_sales_data.csv')
    file_object = io.StringIO(response.content.decode('utf-8'))
    df = pd.read_csv(file_object)
    df.to_csv('data.csv')
    

    运行结果截图:
    图片描述

  2. 读取所有月份的总利润并使用折线图显示。

    题目思路:用xlabel()设置标签,xticks()设置坐标轴间隔,title()进行标题设置。

    程序代码:

    """
    程序名:实验11.2.py
    功能:读取所有月份的总利润并使用折线图显示。
    日期:2022.6.13
    版本:1.0
    """
    import pandas as pd
    import matplotlib.pylab as pl
    
    df = pd.read_csv('data.csv')
    pl.plot(df['month_number'], df['total_profit'], color='blue')
    pl.xlabel('Month number')  # x轴标签
    pl.ylabel('Profit in dollar')  # y轴标签
    pl.xticks(range(1, 13, 1))  # x轴间距
    pl.yticks(range(100000, 600000, 100000))  # y轴间距
    pl.title('Company profit per month')  # 标题文本
    pl.show()  # 显示绘制结果图像
    

    运行结果截图:
    图片描述

  3. 获取所有月份的总利润并显示具有以下样式属性的折线图。

    题目思路:marker=‘o’设置标记符,linestyle=’–'设置线型,color='r’设置线条颜色, mfc='k’指定标识符填充颜色。legend()显示图例。

    程序代码:

    """
    程序名:实验11.3.py
    功能:获取所有月份的总利润并显示具有以下样式属性的折线图。折线图应如下所示:
    日期:2022.6.14
    版本:1.0
    """
    import pandas as pd
    import matplotlib.pylab as pl
    
    df = pd.read_csv('data.csv')
    pl.plot(df['month_number'], df['total_profit'], marker='o', linestyle='--', color='r', mfc='k',
            label='Profit data of last year', linewidth=3)
    pl.xlabel('Month number')  # x轴标签
    pl.ylabel('Profit in dollar')  # y轴标签
    pl.xticks(range(1, 13, 1))  # x轴间距
    pl.yticks(range(100000, 600000, 100000))  # y轴间距
    pl.title('Company Sales data of last year')  # 标题文本
    pl.legend(loc=4)
    pl.show()  # 显示绘制结果图像
    

    运行结果截图:
    图片描述

  4. 读取所有产品销售数据并使用多线图显示。即,每个产品的单独一条线。

    题目思路:同时画几条线即可。

    程序代码:

    """
    程序名:实验11.4.py
    功能:读取所有产品销售数据并使用多线图显示。即,每个产品的单独一条线。该图应如下所示:
    日期:2022.6.15
    版本:1.0
    """
    import pandas as pd
    import matplotlib.pylab as pl
    
    df = pd.read_csv('data.csv')
    pl.plot(df['month_number'], df['facecream'], 'o-',color = 'tab:blue',label='Face cream Sales Data', linewidth=3)
    pl.plot(df['month_number'], df['facewash'], 'o-',color = 'tab:orange',label='Face wash Sales Data', linewidth=3)
    pl.plot(df['month_number'], df['toothpaste'], 'o-',color = 'tab:green',label='Toothpaste Sales Data', linewidth=3)
    pl.plot(df['month_number'], df['bathingsoap'], 'o-',color = 'tab:red',label='Bathingsoap Sales Data', linewidth=3)
    pl.plot(df['month_number'], df['shampoo'], 'o-',color = 'tab:purple',label='Shampoo Sales Data', linewidth=3)
    pl.plot(df['month_number'], df['moisturizer'], 'o-',color = 'tab:brown',label='Moisturizer Sales Data', linewidth=3)
    
    pl.xlabel('Month number')  # x轴标签
    pl.ylabel('Sales units in number')  # y轴标签
    pl.xticks(range(1, 13, 1))  # x轴间距
    pl.yticks([1000,2000,4000,6000,8000,10000,12000,15000,18000])  # y轴间距
    pl.title('Sales data')  # 标题文本
    pl.legend(loc=2)
    pl.show()  # 显示绘制结果图像
    

    运行结果截图:
    图片描述

  5. 读取每个月的牙膏销售数据并使用散点图显示。此外,在图中添加一个网格。网格线样式应为“-”。

    题目思路:散点图用scatter(),添加网格用grid(linestyle=‘–’)并设置网格线样式。

    程序代码:

    """
    程序名:实验11.5.py
    功能:读取每个月的牙膏销售数据并使用散点图显示。此外,在图中添加一个网格。网格线样式应为“-”。散点图应如下所示:
    日期:2022.6.15
    版本:1.0
    """
    import pandas as pd
    import matplotlib.pylab as pl
    
    df = pd.read_csv('data.csv')
    pl.scatter(df['month_number'], df['toothpaste'], marker='o', color='tab:blue', label='Tooth paste Sales data',
               linewidth=3)
    pl.grid(linestyle='--')  # 添加网格线
    pl.xlabel('Month number')  # x轴标签
    pl.ylabel('Number of units Sold')  # y轴标签
    pl.xticks(range(1, 13, 1))  # x轴间距
    pl.yticks(range(4500, 8001, 500))  # y轴间距
    pl.title('Tooth paste Sales data')  # 标题文本
    pl.legend(loc=2)
    pl.show()  # 显示绘制结果图像
    

    运行结果截图:
    图片描述

  6. 读取面霜和洗面奶产品销售数据并使用条形图显示。条形图应显示每个产品每月售出的单位数量。

    题目思路:注意网格线的添加,需要注意两个图的x轴坐标需要错开。

    程序代码:

    """
    程序名:实验11.6.py
    功能:读取面霜和洗面奶产品销售数据并使用条形图显示。条形图应显示每个产品每月售出的单位数量。条形图应如下所示:
    日期:2022.6.15
    版本:1.0
    """
    import pandas as pd
    from matplotlib import pyplot as plt
    
    df = pd.read_csv('data.csv')
    plt.bar([i - 0.1 for i in df['month_number']], df['facecream'], color='tab:blue', width=0.2,
            label='Face Cream Sales data')
    plt.bar([i + 0.1 for i in df['month_number']], df['facewash'], color='tab:orange', width=0.2,
            label='Face Wash Sales data')
    plt.grid(linestyle='--')  # 添加网格线
    plt.xlabel('Month number')  # x轴标签
    plt.ylabel('Number of units Sold')  # y轴标签
    plt.xticks(range(1, 13, 1))  # x轴间距
    plt.yticks(range(500, 3501, 500))  # y轴间距
    plt.title('Sales units in number')  # 标题文本
    plt.legend(loc=2)
    plt.show()  # 显示绘制结果图像
    

    运行结果截图:
    图片描述

  7. 读取所有月份的沐浴皂销售数据并使用条形图显示,最后将此图保存到硬盘(路径为:D:\7.png,dpi为150)。

    题目思路:条形图用bar(),用savefig(‘D:\7.png’, dpi=150)进行保存即可。

    程序代码:

    """
    程序名:实验11.7.py
    功能:读取所有月份的沐浴皂销售数据并使用条形图显示,最后将此图保存到硬盘(路径为:D:\7.png,dpi为150)。条形图应如下所示:
    日期:2022.6.15
    版本:1.0
    """
    import pandas as pd
    from matplotlib import pyplot as plt
    
    df = pd.read_csv('data.csv')
    plt.bar(df['month_number'], df['bathingsoap'], color='tab:blue')
    plt.grid(linestyle='--')  # 添加网格线
    plt.xlabel('Month number')  # x轴标签
    plt.ylabel('Sales units in number')  # y轴标签
    plt.xticks(range(1, 13, 1))  # x轴间距
    plt.yticks(range(2000, 14001, 2000))  # y轴间距
    plt.title('bathingsoap sales data')  # 标题文本
    plt.savefig('D:\\7.png', dpi=150)
    plt.show()  # 显示绘制结果图像
    

    运行结果截图:
    图片描述

  8. 计算每种产品去年的总销售数据并使用饼图显示。注意:在饼图中显示每种产品每年售出的单位数量百分比。

    题目思路:饼图用pie()通过列表推导式中i.sum(),分别返回每个产品的总销售数据,通过autopct='%0.1f%%'参数设置饼图各自所占百分比。

    程序代码:

    """
    程序名:实验11.8.py
    功能:计算每种产品去年的总销售数据并使用饼图显示。注意:在饼图中显示每种产品每年售出的单位数量百分比。饼图应如下所示:
    日期:2022.6.16
    版本:1.0
    """
    import pandas as pd
    from matplotlib import pyplot as plt
    
    df = pd.read_csv('data.csv')
    labels = ['Facecream', 'Facewash', 'Toothpaste', 'Bathing soap', 'Shampoo', 'Moisturizer']
    plt.pie([i.sum() for i in
             [df['facecream'], df['facewash'], df['toothpaste'], df['bathingsoap'], df['shampoo'], df['moisturizer']]],
            labels=labels, autopct='%0.1f%%')
    plt.title('Sales data')  # 标题文本
    plt.legend(loc=4)
    plt.show()  # 显示绘制结果图像
    

    运行结果截图:
    图片描述

  9. 阅读所有月份的沐浴皂洗面奶并使用子图显示它。

    题目思路:通过subplots(2, sharex=‘col’)共享两个子图的x坐标轴即可。

    程序代码:

    """
    程序名:实验11.9.py
    功能:阅读所有月份的沐浴皂洗面奶并使用子图显示它。子图应如下所示:
    日期:2022.6.16
    版本:1.0
    """
    import matplotlib.pyplot as plt
    
    import pandas as pd
    import matplotlib.pylab as pl
    
    df = pd.read_csv('data.csv')
    fig, ax = pl.subplots(2, sharex='col')
    ax1 = ax[0]
    ax1.plot(df['month_number'], df['bathingsoap'], 'o-', color='k', linewidth=3)
    ax1.set_title('Sales data of a bathingsoap')  # 标题文本
    pl.xticks(range(1, 13, 1))  # x轴间距
    pl.yticks(range(6000, 14001, 2000))  # y轴间距
    
    ax2 = ax[1]
    ax2.plot(df['month_number'], df['facewash'], 'o-', color='r', linewidth=3)
    pl.xlabel('Month number')  # x轴标签
    pl.ylabel('Sales units in number')  # y轴标签
    pl.yticks(range(1200, 2001, 200))  # y轴间距
    ax2.set_title('Sales data of a facewash')  # 标题文本
    pl.show()  # 显示绘制结果图像
    

    运行结果截图:
    图片描述

  10. 请查阅关于直方图的资料(plt.hist)。之后读取每个月的总利润并使用直方图显示(横轴为利润范围)。

    题目思路:通过bins和xticks共同设置柱的个数和x轴的间距。

    程序代码:

    """
    程序名:实验11.10.py
    功能:请查阅关于直方图的资料(plt.hist)。之后读取每个月的总利润并使用直方图显示(横轴为利润范围)。直方图应如下所示:
    日期:2022.6.17
    版本:1.0
    """
    
    import pandas as pd
    from matplotlib import pyplot as plt
    
    df = pd.read_csv('data.csv')
    bins = [150000, 175000, 200000, 225000, 250000, 300000, 350000]
    plt.hist(df['total_profit'], bins, color='tab:blue', label='Profit data')
    plt.xlabel('profit range in dollar')  # x轴标签
    plt.ylabel('Actual Profit in dollar')  # y轴标签
    plt.yticks(range(6))  # y轴间距
    plt.xticks([150000, 175000, 200000, 225000, 250000, 300000, 350000])  # x轴间距
    plt.title('Profit data')  # 标题文本
    plt.legend(loc=2)
    plt.show()  # 显示绘制结果图像
    

    运行结果截图:
    图片描述

五、实验小结

问题和解决办法

  1. 在直方图中设置bins为不等间距以后画出来的直方图还是等间距的。

    解决方法:bins只用来设置画出的柱的个数,需要再用xticks来设置x轴的间距。

  2. 在设置两个子图以后,只使用title()设置标题只能设置一个标题。

    解决方法:使用ax2.set_title()来设置第二个子图的标题或更多子图的标题。

  3. 图例无法设置位置。一直在右上角。

    解决方法:图例legend()中有一个参数为loc= 分别可以设置为1,2,3,4… 1代表右上角 4代表右下角 依次逆时针计算即可。

心得体会

  1. 数据分析这一章主要是进行图像的绘画,在学习该章内容的时候,感觉主要代码问题是各种图像的名字以及对应图像中的参数的设置,需要进行记忆。
  2. python基本内容已经学完了,学到现在发现python是一门非常实用的语言,对我们的日常生活有非常大的帮助,使用python并不需要像C++或C一样自己去编写许多函数,在python内部装了非常多的函数和模块,都可以直接进行使用。
;