一、实验目的
1.理解python语言中matplotlib库的各函数作用;
2.掌握matplotlib库中常用函数,能够用其进行画图;
二、实验内容
用matplotlib库中函数进行画图,数据可以用随机函数生成,也可以用其他数据,数据集不做限制,需绘制的图像有:
(1)直方图。用sin函数在区间[0,π/2]上100个点做数据;
(2)散点图。用sin和cos函数在区间[0,π/2]上100个点做数据;
(3)饼图。画出标签为1,2,3,4,大小为10,20,30,40的四个扇形组成的饼图;
(4)曲线图。用sin和cos函数在区间[0,π/2]上100个点做数据;
(5)子图。在两个子图中分别用sin和cos函数在区间[0,π/2]上100个点做数据。
可能会用到的matplotlib库中的函数:linspace、subplot、plot、axis、show、scatter、xlabel、ylabel、title、hist、pie等。根据课堂上对该问题的描述和分析,自行完成程序设计并实现,要求算法描述准确且程序运行正确。
三、设计与实现
详细描述设计过程、关键问题的实现方法及算法的分析说明。
1、制作数据
(1)使用linspace()函数定义均匀间隔创建数值序列。其实,需要指定间隔起始点、终止端,以及指定分隔值总数(包括起始点和终止点);最终函数返回间隔类均匀分布的数值序列。在此数据的起始点为0,终止点为pi/2,在此区间内选择100个值,从而得到(0,π/2)区间内的100个数。
(2)定义一个sindata[]列表,利用循环计算100个数对应的sin值,将其添加到sindata的列表中,同理,定义一个cosdata[]列表,利用循环计算100个数对应的cos值,将其添加到cosdata的列表中。
(3)定义一个sincos[]列表,利用循环和判断,将100个数中的奇数个数对应的区间值的sin值求出,偶数个数对应的区间值的cos值求出,添加到sincos中。
2、绘图
为方便展示规定画布大小为正方形(6,6)
(1)直方图hist(),统计各个区间的数值,取sindata中的数据,bins为统计的区间分布,这里取20个区间,color设置为蓝色,每个柱形的边缘颜色为黑色,设置x轴的标签为数值,y轴的标签为频数,图的标题为直方图,并将绘制完的直方图进行保存展示。
(2)散点图scatter(),x的数据为区间(0,π/2),y的值为其对应sincos数据中的值。x轴的标签为x,y轴的标签为y,图的标题为散点图,并将其进行保存展示。
(3)饼图pie(),定义一个列表label[]存放饼图的标签,列表explode[]设定各项距离圆心n个半径,列表values[]存放饼图各部分对应的值,设置图的标题为饼图,显示图例,并将其进行保存展示。
(4)曲线图plot(),x的数据为区间(0,π/2),y的值为其对应sincos数据中的值。颜色为红色,线条宽度为2。x轴的标签为x,y轴的标签为y,图的标题为曲线图,并将其进行保存展示。
(5)子图subplot(),创建两个子图,一行两列的绘图区域,第一个图放在左边区域,第二个图放在右边区域。绘制第一个图为以区间(0,π/2)为x轴,sindata为y轴的曲线图,颜色为红色,宽度为2,x轴的标签为x,y的标签为y,子图标题为sin(x),绘制第一个图为以区间(0,π/2)为x轴,cosdata为y轴的曲线图,颜色为蓝色,宽度为2,x轴的标签为x,y的标签为y,子图标题为cos(x),将绘制完成的子图进行展示并保存。
四、测试与分析(附测试用例,运行结果截图等)
如图,直方图由有一个个柱形组成,x轴为(0,π/2)区间上100个点对应的sin值也就是(0,1),y轴为每个区间数值对应的频数,取20个区间值,每个区间表示0.05,图标题为“直方图”;散点图的x轴为(0,π/2)区间,y轴按照100个点的sin值,cos值交替组成,对应(0,1)的范围内,图标题为“散点图”。
如图,饼图由有一个个扇形组成,每个扇形的标签分别为1,2,3,4,对应的比例为10.0%,20.0%,30.0%,40%,每部分用不同的颜色表示,并注明图例,图标题为“饼图”;曲线图的x轴为(0,π/2)区间,y轴按照100个点的sin值,cos值交替组成,对应(0,1)的范围内,图标题为“曲线图”。
如图,子图有两个曲线图组成组成,第一部分x轴为(0,π/2)区间,y轴为(0,π/2)区间上100个点对应的sin值,图标题为“sin(x)”;第二部分x轴为(0,π/2)区间,y轴为(0,π/2)区间上100个点对应的cos值,图标题为“cos(x)”。
五、设计技巧及体会
1.实验过程中遇到的问题及解决办法;
问题:对函数的应用不熟练;对数据进行处理时,确定x轴和y轴的数值;中文与负数的显示;如何在完成图像的绘制后,进一步进行丰富。
解决方法:对之前学习的知识进行整理回顾,在分析实验要求时,一步一步理清思路,对一些数据分析案例进行学习,在此基础上不断完善自己的绘图。
2.对设计进行评价(优点与不足);
优点:基本完成实验要求,掌握了常见图形的绘制方法,设计过程有条有理,循序渐进,简单明了。
缺点:在完成绘图的基础上,还可以增加一些额外的功能使图像更加丰富,如直方图上标注各项对应的值,标题字体的大小等。
3.对设计及调试过程的心得体会。
首先是对于思路的分析,明确目标,需要使用的数据,对数据进行预处理,需要使用的到的函数,了解函数对应的参数,其次,在完成实验要求的基础上,保证代码简洁,适当添加注释进行说明,然后对于Python库的学习不能停留在简单的掌握,课下还需进行深入的自主学习,最后一点,就是多练习多敲代码,只有真正的将学到的知识,应用到实际中,完成数据分析,才能真正掌握。
六、附源代码
import matplotlib.pyplot as plt
import numpy as np
import math
plt.rcParams['font.sans-serif']='SimHei'#设置中文显示
plt.rcParams['axes.unicode_minus']=False #设置符号显示
# 制作数据
region = np.linspace(0, math.pi/2, 100) #选取区间[0,π/2]
#print(region)
sindata = []#制作sin数据
for i in range(len(region)):
y = math.sin(region[i])
sindata.append(y)
#print(sindata)
cosdata = []#制作cos数据
for i in range(len(region)):
y = math.cos(region[i])
cosdata.append(y)
#print(cosdata)
sincos = [] #制作sin和cos的数据 偶数个时取其对应的sin值,奇数个时取其对应的cos值
for i in range(len(region)):
if i%2 == 0 :
y = math.sin(region[i])
sincos.append(y)
else:
y = math.cos(region[i])
sincos.append(y)
# (1)直方图。用sin函数在区间[0,π/2]上100个点做数据;
plt.figure(figsize=(6,6))#将画布设定为正方形
plt.hist(sindata, bins = 20, color='blue', edgecolor = 'black')
plt.xlabel('数值')
plt.ylabel('频数')
plt.title("直方图")
plt.savefig('./直方图')#保存图片
plt.show()
# (2)散点图。用sin和cos函数在区间[0,π/2]上100个点做数据;
plt.figure(figsize=(6,6))#将画布设定为正方形
plt.scatter(region, sincos)
plt.xlabel('x')
plt.ylabel('y')
plt.title("散点图")
plt.savefig('./散点图')#保存图片
plt.show()
# (3)饼图。画出标签为1,2,3,4,大小为10,20,30,40的四个扇形组成的饼图;
plt.figure(figsize=(6,6))#将画布设定为正方形
label=['1','2','3','4']#定义饼图的标签,标签是列表
explode=[0.01,0.01,0.01,0.01]#设定各项距离圆心n个半径
values=[10,20,30,40]
plt.pie(values,explode=explode,labels=label,autopct='%1.1f%%')#绘制饼图
plt.title('饼图')#绘制标题
plt.legend()
plt.savefig('./饼图')#保存图片
plt.show()
# (4)曲线图。用sin和cos函数在区间[0,π/2]上100个点做数据;
plt.figure(figsize=(6,6))#将画布设定为正方形
plt.plot(region,sincos,color="red",linewidth=2)
plt.xlabel('x')
plt.ylabel('y')
plt.title("曲线图")
plt.savefig('./曲线图')#保存图片
plt.show()
# (5)子图。在两个子图中分别用sin和cos函数在区间[0,π/2]上100个点做数据。
plt.subplots_adjust(wspace=0.45)
plt.subplot(121)
plt.plot(region,sindata,color="red",linewidth=2)
plt.xlabel('x')
plt.ylabel('y')
plt.title("sin(x)")
plt.subplot(122)
plt.plot(region,cosdata,color="blue",linewidth=2)
plt.xlabel('x')
plt.ylabel('y')
plt.title("cos(x)")
plt.savefig('./子图')#保存图片
plt.show()