实验十一 数据分析与可视化
一、实验学时:2学时
二、实验目的
- 掌握pandas的read_csv函数
- 掌握并使用matplotlib.pyplot中plot函数以及各个参数用法
- 掌握并使用matplotlib.pyplot中scatter函数以及各个参数用法
- 掌握并使用matplotlib.pyplot中pie函数以及各个参数用法
- 掌握并使用matplotlib.pyplot中bar函数以及各个参数用法
- 查阅并使用matplotlib.pyplot中直方图函数以及各个参数用法
三、实验内容
- 利用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’))
- 读取所有月份的总利润并使用折线图显示。折线图应如下所示:
- 获取所有月份的总利润并显示具有以下样式属性的折线图。折线图应如下所示:
- 读取所有产品销售数据并使用多线图显示。即,每个产品的单独一条线。该图应如下所示:
- 读取每个月的牙膏销售数据并使用散点图显示。此外,在图中添加一个网格。网格线样式应为“-”。散点图应如下所示:
- 读取面霜和洗面奶产品销售数据并使用条形图显示。条形图应显示每个产品每月售出的单位数量。条形图应如下所示:
- 读取所有月份的沐浴皂销售数据并使用条形图显示,最后将此图保存到硬盘(路径为:D:\7.png,dpi为150)。条形图应如下所示:
- 计算每种产品去年的总销售数据并使用饼图显示。注意:在饼图中显示每种产品每年售出的单位数量百分比。饼图应如下所示:
- 阅读所有月份的沐浴皂洗面奶并使用子图显示它。子图应如下所示:
- 请查阅关于直方图的资料(plt.hist)。之后读取每个月的总利润并使用直方图显示(横轴为利润范围)。直方图应如下所示:
四、实验结果
-
利用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')
运行结果截图:
-
读取所有月份的总利润并使用折线图显示。
题目思路:用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() # 显示绘制结果图像
运行结果截图:
-
获取所有月份的总利润并显示具有以下样式属性的折线图。
题目思路: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() # 显示绘制结果图像
运行结果截图:
-
读取所有产品销售数据并使用多线图显示。即,每个产品的单独一条线。
题目思路:同时画几条线即可。
程序代码:
""" 程序名:实验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() # 显示绘制结果图像
运行结果截图:
-
读取每个月的牙膏销售数据并使用散点图显示。此外,在图中添加一个网格。网格线样式应为“-”。
题目思路:散点图用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() # 显示绘制结果图像
运行结果截图:
-
读取面霜和洗面奶产品销售数据并使用条形图显示。条形图应显示每个产品每月售出的单位数量。
题目思路:注意网格线的添加,需要注意两个图的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() # 显示绘制结果图像
运行结果截图:
-
读取所有月份的沐浴皂销售数据并使用条形图显示,最后将此图保存到硬盘(路径为: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() # 显示绘制结果图像
运行结果截图:
-
计算每种产品去年的总销售数据并使用饼图显示。注意:在饼图中显示每种产品每年售出的单位数量百分比。
题目思路:饼图用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() # 显示绘制结果图像
运行结果截图:
-
阅读所有月份的沐浴皂洗面奶并使用子图显示它。
题目思路:通过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() # 显示绘制结果图像
运行结果截图:
-
请查阅关于直方图的资料(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() # 显示绘制结果图像
运行结果截图:
五、实验小结
问题和解决办法
-
在直方图中设置bins为不等间距以后画出来的直方图还是等间距的。
解决方法:bins只用来设置画出的柱的个数,需要再用xticks来设置x轴的间距。
-
在设置两个子图以后,只使用title()设置标题只能设置一个标题。
解决方法:使用ax2.set_title()来设置第二个子图的标题或更多子图的标题。
-
图例无法设置位置。一直在右上角。
解决方法:图例legend()中有一个参数为loc= 分别可以设置为1,2,3,4… 1代表右上角 4代表右下角 依次逆时针计算即可。
心得体会
- 数据分析这一章主要是进行图像的绘画,在学习该章内容的时候,感觉主要代码问题是各种图像的名字以及对应图像中的参数的设置,需要进行记忆。
- python基本内容已经学完了,学到现在发现python是一门非常实用的语言,对我们的日常生活有非常大的帮助,使用python并不需要像C++或C一样自己去编写许多函数,在python内部装了非常多的函数和模块,都可以直接进行使用。