目录
什么是科学计算可视化?
第1关:绘制直角坐标系
编程要求
第2关:绘制带标签的余弦曲线散点图
编程要求
第3关:在多个坐标系中绘制图形并显示
相关知识
编程要求
第4关:绘制三维图形
编程要求
科学计算可视化也称为可视化,其定义为:“可视化是一种计算方法,它将符号或数据转换为直观的几何图形,便于研究人员观察其模拟和计算过程。可视化包括了图像综合,这就是说,可视化是用来解释输入到计算机中的图像数据,并从复杂的多维数据中生成图像的一种工具。”
科学计算可视化的实现可以大大加快数据的处理过程,使每日每时都在产生的庞大数据得到有效的利用;可以在人与数据、人与人之间实现图象通信,而不是文字通信或数字通信;可以使科学家们了解到在计算过程中发生了什么现象, 并可改变参数, 观察其影响 , 对计算过程实现引导和控制。总之,可 使科学计算的 工具和环境进一步现代化。
Python中用于科学计算可视化的模块非常多。其中numpy
模块是科学计算包,提供了Python
中没有的数组对象,支持数组运算、线型代数以及随机数生成等功能。matplotlib
是比较常用的绘图模块,可以快速地将各种计算结果以各种图形形式展示出来。
本实训项目的主要内容是基于Python
语言进行科学数据的图形绘制,从四个方面介绍科学计算可视化的相关知识,并设置了四个关卡在线考察大家利用科学数据进行图形绘制的能力。
matplotlib
是提供数据绘图功能的库,是计算结果可视化的重要工具,其子库pyplot
主要用于实现各种数据的展示图形的绘制。所以,我们先学习使用matplotlib.pyplot
库绘制直角坐标系。
导入库
matplotlib.pyplot
是matplotlib
的子库,引用方式如下:
import matplotlib.pyplot as plt
改变后续代码的命名空间,有助于提高代码可读性。在后续程序中,用plt
代替matplotlib.pyplot
设置直角坐标系的x,y轴
plt.xlim(xmin,xmax) #设置当前x轴的取值范围
plt.ylim(ymin,ymax) #设置当前y轴的取值范围
参数说明: xmin、ymin为x,y轴取值范围的最小值
xmax、ymax为x,y轴取值范围的最大值
打开或关闭坐标网格
plt.grid(‘on’/’off’)
参数说明: ‘on’表示打开坐标网格
‘off’表示关闭坐标网格
显示创建的绘图对象
plt.show()
本关的任务是实现直角坐标系的绘制。具体要求如下:
matplotlib.pyplot
库,重命名为plt
x
,y
轴的取值范围为0-100
#**********begin**********#
#绘制直角坐标系
#导入matplotlib.pyplot库,重命名为plt
import matplotlib.pyplot as plt
def level1():
#创建10*10的绘图区域
plt.figure(figsize=[10,10])
# 设置坐标系x,y轴的取值范围为0-100
plt.xlim(0,100)
plt.ylim(0,100)
#开启坐标网格
plt.grid('on')
#将绘制的图形保存为指定路径下的图片
plt.savefig("task1/image1/t1.png")
#显示创建的绘图对象
plt.show()
#**********end**********#
数组
数组
是一种由同种类型的元素构成的有序的集合,其中的元素类可以用整数索引,可以随时添加和删除,是最常用的数据类型。 一维数组
由对等的有序数据构成,是线性结构,主要用Python
二维数组
由多个一维数组构成,可以看成一维数组的组合形式,可以采用二维列表来表示。
示例如下:
array1=[1,5,7,9] #一维数组可以采用一个列表变量表示
array2=[[3,5,’6’,9],[1,4,’5’,8],[2,5,’7’,8]]
#二维数组可以采用二维列表变量表示,每个列表中第三个元素是字符串类型
numpy库定义的常用的数组创建函数和三角函数
arange(start,end,i)
函数:创建一个由star
到end
,以i
为步长的数组。
linspace(start,end,n)
函数:创建一个由start
到end
,等分成n
个元素的数组。sin(x)
函数:求x
的正弦值。cox(x)
函数:求x
的余弦值。tan(x)
函数:求x
的正切值。pi
:常量π
。
示例如下:
import numpy as np #导入numpy模块,在程序的后续部分以np代替numpy
x=np.arange(0,2*np.pi,0.1) #生成一个数组x,0-2π间,以0.1为步长(生成的数组等同于np.array([0,2,4,6,8],x的值为[0 2 4 6 8])
y=np.sin(x) #对数组x中的所有元素求正弦值,得到新数组y(若代入上述x的值,新数组y即[0. sin(2) sin(4) sin(6) sin(8)])
matplotlib.pyplot子库
matplotlib.pyplot
子库依赖于numpy
模块,可以绘制多种形式的图形,包括散点图、线图、饼状图和直方图等。
matplotlib.pyplot
子库定义了标签设置函数和基础图标函数:
title(s)
函数:设置坐标系标题。参数s
为字符串类型。
xlabel(s)
函数:设置当前x
轴的标签。参数s
为字符串类型。
ylabel(s)
函数:设置当前y
轴的标签。参数s
为字符串类型。
scatter(x,y)
函数:绘制散点图,其中x
,y
是相同长度的数组序列。
使用
numpy
库和matplotlib
库绘制带英文标签的余弦曲线散点图,要求如下:1.导入
numpy
库,并命名为np
。2.设置坐标系标题为
cos(x)
,横轴标签为x
,纵轴标签为y
。3.绘制
y=cos(x)
,其中数组x
中的元素在0-2π
间,以0.1
为步长。
#绘制带标签的余弦曲线散点图
import matplotlib.pyplot as plt
# **********begin**********#
#导入numpy库
import numpy as np
def level2():
plt.figure(figsize=(10, 10))
#绘制坐标系标题
plt.title("cox(x)")
#设置x轴标签
plt.xlabel("x")
#设置y轴标签
plt.ylabel("y")
#创建一个数组x,0-2π间,以0.1为步长
x = np.arange(0,2*np.pi,0.1)
#对数组x中的所有元素求正弦值,得到新数组y
y = np.cos(x)
#将y=cos(x)以散点图的形式展示出来
plt.scatter(x,y)
# **********end**********#
# 将绘制的图形保存为指定路径下的图片
plt.savefig("task2/image1/t2.png")
#显示散点图
plt.show()
本关任务:创建2
行2
列的绘图区域,分别绘制点图、虚线图和连线图。
matplotlib.pyplot
子库定义了一些绘图函数:
subplot(rows,cols,plot_number)
函数:把全局绘图区域分割成rows
行*cols
列的网格,并选择第plot_number
个子绘图区域。
plot(x,y,color,linewidth,linestyle)
函数:根据x
,y
数组绘制直、曲线,color
表示曲线的颜色,linewidth
表示曲线的宽度,linestyle
表示曲线的线型。 常用颜色参数如下表所示:常用线型参数如下表所示:
示例如下:
import matplotlib.pyplot as plt #导入matplotlib.pyplot子模块,在程序的后续部分以plt代替matplotlib.pyplot
x=[2,5] #用列表表示数组x
y=[4,8] #用列表表示数组y
plt.subplot(2,1,1) #将整个绘图区域分割成2行1列的网格,并在第一个位置绘制一个坐标系
呈现下面的效果:
plt.plot(x,y,color=’r’,linewidth=5,linestyle=’-’) #根据x,y数组绘制红色曲线,宽度为5,线型为实线
呈现下面的效果:
在
2
行2
列的绘图区域中绘制连线、虚线和点图,要求如下:1.
x
为一个数组,在0-2π
间,等分成500
个元素。2.在第一位置绘制
y=sin(x)
,实线;第二个位置绘制y=cos(x)
,红色,虚线;第三个位置绘制y=sin(πx)
,点线,绿色,宽度为3
。第四个位置绘制一个空坐标系。
#绘制多个图形并单独显示
import numpy as np
import matplotlib.pyplot as plt
def level3():
plt.figure(figsize=(10,10))
#**********begin**********#
#生成一个数组x,在0-2π间,等分成500个元素。
x = np.linspace(0,2*np.pi,500)
#y1=sin(x)
y1 = np.sin(x)
#y2=cos(x)
y2 = np.cos(x)
#y3=sin(πx)
y3 = np.sin(np.pi*x)
#选择第一行第一列图形
plt.subplot(2,2,1)
#绘制y1=sin(x),用蓝色点线
plt.plot(x,y1,color='b',linestyle='-')
# 选择第一行第二列图形
plt.subplot(2,2,2)
#绘制y2=cos(x),红色,虚线
plt.plot(x,y2,color='r',linestyle='--')
#选择第二行第一列图形
plt.subplot(2,2,3)
#绘制y3 = sin(πx), 绿色,宽度为3
plt.plot(x,y3,color='g',linewidth=3,linestyle=':')
#选择第二行第一列图形
plt.subplot(2,2,4)
#**********end**********#
#将绘制的图形保存为指定路径下的图片
plt.savefig("task3/image1/t3.png")
#显示创建的绘图对象
plt.show()
mpl_toolkits.mplot3d
是Matplotlib
里面专门用来画三维图的工具包,导入该库,即可绘制三维图形。 如果要绘制三维图形,首先需要使用下面的语句导入相应的对象:
import mpl_toolkits.mplot3d
然后使用下面的方法创建三维子图:ax=plt.subplot(projection='3d')
接下来就可以使用ax
的plot()
方法绘制三维曲线、plot_surface()
方法绘制三维曲面、scatter()
方法绘制三维散点图。
绘制三维曲线的方法plot()
代码示例如下: 导入库
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d
绘制三维坐标系
ax=plt.subplot(111,projection='3d')
生成绘图数据
x=np.linspace(0,2*np.pi,300)
y=np.linspace(0,3*np.pi,300)
z=50*np.sin(x+y)
绘制三维曲线
ax.plot(x,y,z)
plt.show()
上述代码呈现下面的效果:
绘制三维曲面的方法plot_surface()
plot_surface(X, Y, Z, rstride,cstride,color)
参数说明:X
,Y
,Z
:指定三个坐标轴的数据。rstride
,cstride
:分别控制x
和y
两个方向的步长,这决定了曲面上每个面片的大小。color
:用来指定面片的颜色
绘制三维散点图的方法scatter(x,y,z,color)
参数说明: x
,y
,z
: 指定散点符号的x
、y
、z
坐标 color
:用来指定散点的颜色
生成随机数的方法numpy库中的random.randint(a,b,c)
参数说明: a
:生成随机数的下限。 b
:生成随机数的上限。 c
:随机数的个数。
一维数组元素切片方法array[start:end:step]
功能:获取一维数组array
中从start
到end
(不包括end
)以step
为步长所对应元素组成的数组。 step
可省略,默认为1
。 代码示例如下:
>>array = np.arange(10) #生成0-9,步长为1的数组
>>print(array)
>>[0 1 2 3 4 5 6 7 8 9] #数组元素
>> print(array[3:5]) #获取索引从3到5的数组元素组成的数组
>>[3 4]
在
2
行2
列的绘图区域中绘制三维曲线、曲面和散点点图,要求如下:1.在第一个绘图区域绘制一条给定数据的三维曲线;
2.在第二个绘图区域绘制一条
z=50*sin(x+y)
三维曲面,x
,y
两个方向的步长分别为2
,3
。3.在第三个绘图区域绘制三维散点图,
x
,y
,z
三个坐标轴的数值分别0-50
之间的30
个随机数。30
个点中,前10
个点红色,中间10
个点蓝色,最后10
个点黄色。
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d
def level4():
#绘制三维曲线
plt.figure(figsize=(10, 10))
#**********begin**********#
#绘制三维坐标系
ax1 = plt.subplot(221,projection='3d')
#生成绘图数据
x1=np.linspace(0,2*np.pi,300)
y1=np.linspace(0,3*np.pi,300)
z1=50*np.sin(x1+y1)
#绘制曲线
ax1.plot(x1,y1,z1)
#绘制三维曲面
#绘制三维坐标系
ax2 = plt.subplot(222,projection='3d')
#生成绘图数据
x2,y2=np.mgrid[-2:2:20j,-2:2:20j]
z2=50*np.sin(x2+y2)
#绘制曲面
ax2.plot_surface(x2,y2,z2,rstride=2,cstride=3)
#绘制三维散点图
#绘制三维坐标系
ax3 = plt.subplot(223,projection='3d')
#生成绘图数据
x3 = np.random.randint(0,50,30)
y3 = np.random.randint(0,50,30)
z3 = np.random.randint(0,50,30)
#按区域绘制不同颜色散点
ax3.scatter(x3[0:10],y3[0:10],z3[0:10],color='r')
ax3.scatter(x3[10:20],y3[10:20],z3[10:20],color='b')
ax3.scatter(x3[20:30],y3[20:30],z3[20:30],color='y')
#**********end**********#
#将绘制的图形保存为指定路径下的图片
plt.savefig("task4/image1/t4.png")
#显示创建的绘图对象
plt.show()