实验目的
- 1.学习绘图库Matplotlib的使用。
- 2.掌握绘图库常见的图形类型,常用的线型、颜色、标记符号。
- 3.掌握多子图绘制的方法
实验内容
启动Spyder,在Spyder环境下编写完整程序完成下列练习。
实验1
利用[2, 3, 5, 10, 8]列表数据绘制折线图、柱形图、饼图。
import matplotlib.pyplot as plt # 导入plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定中文黑体字体
plt.rcParams['axes.unicode_minus'] = False # 确保-负号显示正常
x = [2, 3, 5, 10, 8]
labels = list('abcde')
plt.plot(x, 'b-') # 折线图
plt.figure() # 新建图形
plt.bar(labels, x) # 柱形图
plt.figure() # 新建图形
explode = [0, 0, 0.1, 0.2, 0]
plt.pie(x, explode=explode, labels=labels, autopct='%1.1f') # 饼图
plt.show() # 显示图形
实验2
生成1000个N(1, 10)正态分布的随机小数,绘制箱线图。
注:N(1,10) 则 scale= 10**(1/2)
x=np.random.normal(1, 10**(1/2),1000)
plt.boxplot(x)
print('方差:', x.var()) # 方差应近似10
实验3
绘制如图所示的多子图。
x = np.arange(1,100)
Plt.subplot(2,2,1)
plt.plot(x, x) # 2行x2列图形的第一个子图
Plt.subplot(2,2,2) # 2行x2列图形的第二个子图
plt.plot(x, -x)
Plt.subplot(2, 2, 3) # 2行x2列图形的第三个子图
plt.plot(x, x**2)
Plt.subplot(2, 2, 4) # 2行x2列图形的第四个子图
Plt.plot(x, np.log(x))
实验4
利用matplotlib库中的pyplot模块,绘制x在[-10,10]取值区间上的函数
一阶导数和二阶导数的图形,要求:
(1)绘制三个子图,分别放置上述三个图形
(2)第一个子图区域,标题为Polynomial,使用红色实线绘制
(3)第二个子图区域,标题为First Derivative,使用蓝色虚线绘制
(4)第三个子图区域,标题为Second Derivative,使用绿色实心圆点绘制
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
matplotlib.rcParams['font.family']='SimHei'
matplotlib.rcParams['axes.unicode_minus']=False
plt.suptitle("f(x)函数、一阶导数、二阶导数折线图")
plt.subplot(3,1,1)
plt.title("Polynomial")
plt.xlim(-10,10)
plt.xticks([-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10])#设置x轴刻度
x=np.arange(-10,10)
y1=x*x*x+2*x*x+3*x+4
plt.plot(x,y1,"g-")
plt.subplot(3,1,2)
plt.title("First Derivativ")
plt.xlim(-10,10)
plt.xticks([-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10])#设置x轴刻度
x=np.arange(-10,10)
y2=3*x*x+4*x+3
plt.plot(x,y2,"b:")
plt.subplot(3,1,3)
plt.title("Second Derivative")
plt.xlim(-10,10)
plt.xticks([-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10])#设置x轴刻度
x=np.arange(-10,10)
y2=4*x+4
plt.plot(x,y2,"g.")
plt.show()
运行效果图:
实验5
教材213页【例9-3】
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
matplotlib.rcParams['font.family']='SimHei'
matplotlib.rcParams['axes.unicode_minus']=False
stuScore=np.loadtxt('studnt_score.csv',delimiter=',')
#切掉学号,返回学生三门课程的总分
sumEach=np.sum(stuScore[:,1:],axis=1)
#返回所有学生每门课程的平均分
avgEachCourse=np.average(stuScore[:,1:],axis=0)
maxMath=np.max(stuScore[:,1]) #返回高数最高分
maxEng=np.max(stuScore[:,2]) #返回英语最高分
maxPython=np.max(stuScore[:,3]) #返回Python最高分
minMath=np.min(stuScore[:,1]) #返回高数最低分
minEng=np.min(stuScore[:,2]) #返回英语最低分
minPython=np.min(stuScore[:,3]) #返回Python最低分
print("每个学生的三门课程的总分:")
print(sumEach)
print("所有学生的每门课程的平均分:")
print(avgEachCourse)
print("每门课程的最高分:")
print(maxMath,maxEng,maxPython)
print("每门课程的最低分:")
print(minMath,minEng,minPython)
mathScore=stuScore[:,1] #取高数成绩
engScore=stuScore[:,2] #取英语成绩
pythonScore=stuScore[:,3] #取Python成绩
plt.suptitle("课程成绩分布直方图")#为当前绘图区添加标题
#绘制高数成绩直方图 从0-100分成10段
plt.subplot(3,1,1)
plt.hist(mathScore,bins=10,range=(0,100),color='red')
plt.xlabel("高数成绩分数段")
plt.ylabel("人数")
plt.xlim(0,100)
plt.xticks([0,10,20,30,40,50,60,70,80,90,100])#设置x轴刻度
plt.yticks([0,2,4,6,8,10,12,14,16,18,20])
plt.grid()
#绘制英语成绩直方图 从0-100分成10段
plt.subplot(3,1,2)
plt.hist(mathScore,bins=10,range=(0,100),color='red')
plt.xlabel("英语成绩分数段")
plt.ylabel("人数")
plt.xlim(0,100)
plt.xticks([0,10,20,30,40,50,60,70,80,90,100])#设置x轴刻度
plt.yticks([0,2,4,6,8,10,12,14,16,18,20])
plt.grid()
#绘制python成绩直方图 从0-100分成10段
plt.subplot(3,1,3)
plt.hist(mathScore,bins=10,range=(0,100),color='red')
plt.xlabel("Python成绩分数段")
plt.ylabel("人数")
plt.xlim(0,100)
plt.xticks([0,10,20,30,40,50,60,70,80,90,100])#设置x轴刻度
plt.yticks([0,2,4,6,8,10,12,14,16,18,20])
plt.grid()
plt.show()
运行效果图:
知识点概括:可视化:Matplotlib
Matplotlib库是一个非常强大的二维绘图库,Matplotlib提供了两个便捷的绘图子模块:
pyplot:通过简洁的绘图函数实现不同的绘图功能
pylab: 使用方法与pyplot模块类似
1.一般采用如下方式引入matplotlib库中的pyplot模块
import matplotlib.pyplot as plt
2.1 pyplot模块的使用
举例:
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
matplotlib.rcParams['font.family']='SimHei'
matplotlib.rcParams['axes.unicode_minus']=False
x=np.linspace(0,10,100)
y=np.sin(x)
plt.plot(x,y,"r")
运行效果图:
1)pyplot.plot()函数的使用
颜色风格设置:plot()函数默认情况下绘制出的图形是连续的,不过我们也可以通过增加线型的格式字符串来控制点线的颜色、风格来绘制各式各样的图形。
例如:
plt.plot(x,y,"r*:") #红色 *号 虚线
左:效果图
2)坐标轴与标签设置
函数 | 描述 |
plt.axis() | 获取或者设置轴属性的方法 |
plt.xlim(xmin, xmax) | 设置当前x轴取值范围 |
plt.ylim(ymin,ymax) | 设置当前y轴取值范围 |
plt.xticks() | 设置x轴缩放/刻度 |
plt.yticks() | 设置y轴缩放 |
plt.xlabel() | 设置x轴的标签 |
plt.ylabel () | 设置y轴的标签 |
plt.legend() | 设置当前图例 |
plt.text() | 为图形添加文字注释 |
plt.title() | 为坐标系添加标题 |
例如:
import matplotlib.pyplot as plt import numpy as np x=np.arange(10) y1=x ; y2=2*x; y3=3*x plt.plot(x,y1,"ro--",x,y2,"gv:",x,y3,"bs-") plt.axis(‘scaled') # 设置x轴y轴按实际比例显示 plt.xlim(0,10) # 设置x轴的区间 plt.ylim(0,30) # 设置y轴的区间 plt.xticks([0,1,2,3,4,5,6,7,8,9,10]) plt.yticks([5,10,15,20,25,30],['a','b','c','d','e','f']) # 'a'与5对应,'b'与[10]对应 y_ticks,labels=plt.yticks() # 返回y轴的标签刻度值和对应标签 plt.xlabel("x-axis") # 设置x轴标签 plt.ylabel("y-axis") # 设置y轴标签 plt.legend(["y1=x","y2=2x","y3=3x"]) # 添加图例 plt.text(4,2,"TEXT") # TEXT可以换成你想要显示的文本 plt.title("TITLE") # TITLE可以换成你想要显示的文本 plt.show()
3)pyplot模块绘图函数示例
函数 | 描述 |
boxplot() | 绘制箱型图 |
bar() | 绘制竖向条形图 |
barh() | 绘制横向条形图 |
contour() | 绘制等高线 |
hist() | 绘制直方图 |
pie() | 绘制饼图 |
plot_date() | 绘制包含日期型数据的图 |
polar() | 绘制极坐标图 |
psd() | 功率谱密度 |
scatter() | 绘制散点图 |
specgram() | 绘制频谱图 |
stem() | 绘制火柴杆图 |
step() | 绘制步阶图 |
例如:饼图
import matplotlib.pyplot as plt Labels = 'Class-A', 'Class-B', 'Class-C', 'Class-D' data = [15, 30, 45, 10] Explode = (0, 0.1, 0, 0) #这些数值用来扩大饼图中的特定部分(给定为0的部分将保持其原始大小)。 #在这个例子中,'Class-B'部分将会被扩大10%,其余部分保持不变。 plt.pie(data, explode=Explode,labels=Labels,autopct='%.2f%%') plt.show()
4)子图绘制——subplot()函数
subplot ( nrow, ncols,index):
在绘图区域创建子绘图区域。
nrows:把绘图区分割成nrows行
ncols:把绘图区分割成ncols列
index:指定当前子绘图区域的索引 从1开始,1、2、3...
*中文显示问题
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family']='kaiti'
matplotlib.rcParams['axes.unicode_minus']=False # 设置负号显示正常
标识符
描述
‘Simhei’
黑体
‘Kaiti’
楷体
‘Microsoft YaHei’
微软雅黑
例如:
plt.title("坐标系标题",fontproperties="Simhei")
实操注意事项
1.查看电脑中matplotlib相关信息
2.想让图片不是显示在绘图面板而是独立显示在一个窗口
在控制台输入
%matplotlib
%matplotlib inline #嵌入式