第三章 数据可视化
目录
一.绘制二维图形
3.1.1 绘制随机图形
注:使用matplotlab的pyplot库绘制图形,plot:绘制。matrix:矩阵。
注:seed( ) 函数:用于指定随机数生成时所用算法开始的整数值。为了方便复现。
1.如果使用相同的seed( )值,则每次生成的随即数都相同;不能看成一个序列,是随机的,但是相同的随机数的值相同。
2.如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。
3.设置的seed()值仅一次有效,是全局函数,后面也不变。
4.矩阵中为np.random.seed(x)
例1:
import numpy as np
num=0
while(num<5):
np.random.seed(5)
print(np.random.randn()) #np.random.randn()为生成一组随机数满足正态分布,()内为维度结构。空为1个,x为x个一行。
#np.random.rand()为生成一组随机数在[0,1)之间,()()内为维度结构。空为1个,x为x个一行。
num+=1
0.44122748688504143
0.44122748688504143
0.44122748688504143
0.44122748688504143
0.44122748688504143
例2
np.random.seed(3)
a= np.random.randn()
b= np.random.randn()
c=np.random.randn()
print(a)
print(b)
print(c)
1.7886284734303186
0.43650985051198943
0.09649746807200862
例3
np.random.seed(3)
a= np.random.randn()
np.random.seed(10)
b= np.random.randn()
print(a)
print(b)
1.7886284734303186
1.331586504129518
作图:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
#在Jupyter中显示图形
x=np.arange(10) # 生成从0开始向量数组[0,1,2,3,4,5,6,7,8,9]
np.random.seed(10) # 使每次产生的随机数相同
y=np.random.randn(10) # 生成元素为0-1的随机矩阵,八位有效数字。
print(x)
print(y)
plt.plot(x,y) #创建图形,绘制线条,该线条过x,y对应的点。
plt.show() #显示当前图形
[0 1 2 3 4 5 6 7 8 9]
[ 1.3315865 0.71527897 -1.54540029 -0.00838385 0.62133597 -0.72008556
0.26551159 0.10854853 0.00429143 -0.17460021]
3.1.2 代码清单的格式
3.1.3 绘制三次函数
例:绘制三次函数f(x)=(x-2)x(x+2)
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
def f(x):
return (x-2)*x*(x+2)
print(f(1))
print(f(np.array([1,2,3]))) #注:当x为ndarray数组时,程序会一次性以ndarray类型返回各个元素对应的f。
-3
[-3 0 15]
3.1.4 确定绘制范围
1.np.arange(a,b,n)函数
x=np.arange(-3,3.4,0.5) # 左闭右开
print(x)
[-3. -2.5 -2. -1.5 -1. -0.5 0. 0.5 1. 1.5 2. 2.5 3. ]
2.np.linspace(a,b,n)
x=np.linspace(-3,3,10)
print(np.round(x,2))
[-3. -2.33 -1.67 -1. -0.33 0.33 1. 1.67 2.33 3. ]
3.1.5 绘制图形
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
def f(x):
return (x-2)*x*(x+2)
x=np.linspace(-3,3,10)
plt.plot(x,f(x))
plt.show
3.1.6 装饰图形
例:画两条曲线:(x-1)x(x+2)与(x-2)x(x+2)
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
def f2(x,w):
return (x-w)*x*(x+2)
#定义x
x=np.linspace(-3,3,100)
#绘制图形
plt.plot(x,f2(x,2),color="r",label="$w=2$") #label:标签。label="$标签内容$"。
plt.plot(x,f2(x,1),color="cornflowerblue",label="$w=1$")
plt.legend(loc="upper left") #显示图例:upper,lower,left,right legend:传说,图例,说明。
plt.ylim(-15,15) #y轴的范围:plt.ylim(n1,n2)
plt.title("$f_2(x)$") #标题:plt.title("$名字$")
plt.xlabel("$x$") #x标签:plt.xlabel("$x轴标签$")
plt.xlabel("$y$") #y标签:plt.xlabel("$y轴标签$")
plt.grid(True) #网格线:plt.grid(True)显示网格线。plt.grid(False)不显示网格线。默认不显示。
plt.show()
显示:
3.1.7 并列显示多张图片
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
def f2(x,w):
return (x-w)*x*(x+2)
x=np.linspace(-3,3,100)
plt.figure(figsize=(10,3)) # plt.figure(figsize=(w,h)):用于指定整个绘制区域的大小,宽度w,高度h。figure:数值。
plt.subplots_adjust(wspace=0.5,hspace=0.5) # plt.subplots_adjust(wspace=w,hspace=h):调节两相邻区域的横向间隔与纵向间隔。
for i in range(6): #for循环,i从0取到5
plt.subplot(2,3,i+1)
plt.title(i+1)
plt.plot(x,f2(x,i),color="k") # 绘图:k为颜色代码,color="k"。
plt.ylim(-20,20)
plt.grid(True)
plt.show()
显示:
3.2 绘制三维函数
3.2.1 包含两个变量的函数
例:绘制函数f(x0,x1)=(2x0^ 2+x1^ 2)exp(-(2x0^ 2+x1^2))
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# 定义函数
def f3(x0,x1):
ans=(2*x0**2+x1**2)*np.exp(-(2*x0**2+x1**2))
return ans
#根据x0,x1计算f3
xn=9
x0=np.linspace(-2,2,xn)
x1=np.linspace(-2,2,xn)
y=np.zeros((len(x0),len(x1)))
for i0 in range(xn):
for i1 in range(xn):
y[i1,i0]=f3(x0[i0],x1[i1])
print(np.round(y,2))
[[0. 0. 0.01 0.05 0.07 0.05 0.01 0. 0. ]
[0. 0.01 0.06 0.18 0.24 0.18 0.06 0.01 0. ]
[0. 0.02 0.15 0.33 0.37 0.33 0.15 0.02 0. ]
[0. 0.04 0.24 0.35 0.19 0.35 0.24 0.04 0. ]
[0. 0.05 0.27 0.3 0. 0.3 0.27 0.05 0. ]
[0. 0.04 0.24 0.35 0.19 0.35 0.24 0.04 0. ]
[0. 0.02 0.15 0.33 0.37 0.33 0.15 0.02 0. ]
[0. 0.01 0.06 0.18 0.24 0.18 0.06 0.01 0. ]
[0. 0. 0.01 0.05 0.07 0.05 0.01 0. 0. ]]
**注:
1.y[a,b]中,列顺序循环b内循环a,与for语句顺序相反;行顺序循环a内循环b,与for语句顺序相同。两者图像关于’‘x_0=x_1对角线’‘对称
2.f3(x0[i0],x1[i1])函数中的顺序与for语句中顺序相同或相反时,图像关于’‘x_0=x_1对角线’'对称。
3.最终成像沿纵轴翻折。
**
例:列方向与行方向的区别
for i0 in range(xn): # 列方向
for i1 in range(xn):
y[i1,i0]=f3(x0[i0],x1[i1])
for i1 in range(xn): # 行方向
for i0 in range(xn):
y[i1,i0]=f3(x0[i1],x1[i0])
注:len函数用法:
len函数表示获取list的长度,若x是矩阵,则获取矩阵的行数。
x=np.array([[1,2,3],[3,4,5]])
print(x)
print(len(x))
print(x[0,2])
[[1 2 3]
[3 4 5]]
2
3
3.2.2 用颜色表示数值(像素图)
def f3(x0,x1):
ans=(x0+2*x1)
return ans
xn=9
x0=np.linspace(-2,2,xn) # x0=[-2 -1.5 -1 -0.5 0 0.5 1 1.5 2]
x1=np.linspace(-2,2,xn) # x1=[-2 -1.5 -1 -0.5 0 0.5 1 1.5 2]
y=np.zeros((len(x0),len(x1))) # np.zeros(size):元素全是0的矩阵。len(x):获取list的长度,矩阵的行数。先设置空矩阵,再替换。
for i0 in range(xn): # i0=[0,1,2,3,4,5,6,7,8] 行
for i1 in range(xn): # i1=[0,1,2,3,4,5,6,7,8] 列
y[i1,i0]=f3(x0[i0],x1[i1])
print(np.round(y,2)) # 输出y,保留两位小数。
plt.figure(figsize=(3.5, 3)) # 指定绘图区域,宽3.5,高3
plt.gray() # 指定灰色色调显示
plt.pcolor(y) # 显示矩阵的颜色
plt.colorbar() # 显示矩阵色阶
plt.show()
显示:
注:像素图中会将矩阵搜索准顺序的(0,0)原来在左上角,放置在左下角,上下翻转。无论行顺序还是列顺序。
3.2.3 绘制三维立体图:surface
surface:曲面
def f3(x0,x1):
ans=(2*x0**2+x1**2)*np.exp(-(2*x0**2+x1**2))
return ans
#根据x0,x1计算f3
xn=9
x0=np.linspace(-2,2,xn) # x0=[-2 -1.5 -1 -0.5 0 0.5 1 1.5 2]
x1=np.linspace(-2,2,xn) # x1=[-2 -1.5 -1 -0.5 0 0.5 1 1.5 2]
y=np.zeros((len(x0),len(x1))) # np.zeros(size):元素全是0的矩阵。len(x):获取list的长度,矩阵的行数。先设置空矩阵,再替换。
for i0 in range(xn): # i0=[0,1,2,3,4,5,6,7,8] 行
for i1 in range(xn): # i1=[0,1,2,3,4,5,6,7,8] 列
y[i1,i0]=f3(x0[i0],x1[i1])
print(np.round(y,2))
from mpl_toolkits.mplot3d import Axes3D # “from 库名 import 函数名”:调用函数。
X,Y=np.meshgrid(x0,x1) # 构造网格坐标矩阵,大小与y相同。
plt.figure(1,figsize=(5,3.5)) # 指定图像大小。figure:数字,图像。
ax=plt.subplot(111,projection='3d') # 用于直接指定划分方式和位置进行绘图。 子图类型3d,极点图,等。默认线型图。将图形的id的返回值保存在ax中。
ax.plot_surface(X,Y,y,rstride=1,cstride=1,alpha=0.3,color='blue',edgecolor='black')
# surface:表面,使显露。rstride:每个方向的采样步幅。cstride:控制列采样。subplot创建网格,将多个图滑倒一个平面上。plot:画出v,情节n。
# ax.plot_surface(x,y,z,rstride=1,cstride=1,alpha=0.3,color='blue',edgecolor='black')
# 画出3D图,x横坐标,y纵坐标,z函数值;rstride:行之间的跨度;cstride:列之间的跨度。用于指定纵轴横轴每隔几个元素绘制一条线。数值越小采样点越多。
# alpha用0-1的实数指定透明度,1不透明。edgecolor:网格线的颜色
ax.set_zticks((0,0.2)) # 如果z轴刻度采用默认值,数值会重叠在一起。使用函数将刻度显示限定为0,5,10。
ax.view_init(75,-95) # 用ax.view_init(变量1,变量2)调节三维图形的方向,变量1表示纵向的旋转角度,变量2表示横向的旋转角度。正:顺时针
plt.figure(2,figsize=(5,3.5)) # 指定图像大小。figure:数字,图像。
ax=plt.subplot(111,projection='3d') # 用于直接指定划分方式和位置进行绘图。 子图类型3d,极点图,等。默认线型图。将图形的id的返回值保存在ax中。
ax.plot_surface(X,Y,y,rstride=5,cstride=5,alpha=0.3,color='blue',edgecolor='black')
ax.set_zticks((0,0.2)) # 如果z轴刻度采用默认值,数值会重叠在一起。使用函数将刻度显示限定为0,0.2。
ax.view_init(75,-95)
plt.show()
显示:
注:np.meshgrid()函数:
X,Y=np.meshgrid(x,y)将两个坐标轴上x,y的点转化为平面上的网格,生成网格点坐标矩阵,原理为简单复制.设x轴有m个数据(是长度为m的向量),y轴有n个数据(是长度为n的向量),x,y轴相互垂直。则通过Meshgrid函数X, Y = np.meshgrid(x, y),最终生成两个矩阵X,Y,且X,Y都是n*m的二维矩阵。已知原理为简单复制,那么就是X为将一维的x在y方向上复制n次生成的二维数组,Y在x方向上同理.在Z方向上的值为(xi,yi),之后可用plt.plot(x,y)显示网格点。
之后用plt.plot(X,Y)画图时,X表示所有个网格点位置的横坐标,Y表示所有网格点位置的纵坐标。
注:当输入X[i1,i0]和Y[i1,i0]时,输出f3为y[i1,i0].
例:绘制exp(-t)*cos2πt
def f(t):
return np.exp(-t) * np.cos(2*np.pi*t)
t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)
plt.figure(1) # 创建画板1
plt.subplot(211) # 画板分割,选取第一份
plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k') # 画图:'bo':蓝色圆圈点状图。'k':黑色的简写,默认线型图。
plt.subplot(212) #画板选取第二份
plt.plot(t2, np.cos(2*np.pi*t2), 'r--') # 画出cos的函数,选择红色点状线。
plt.figure(2) # 创建画板2
plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')
plt.show()
显示:
3.2.4 绘制等高线
xn=50
x0=np.linspace(-2,2,xn)
x1=np.linspace(-2,2,xn)
y=np.zeros((xn,xn))
for i0 in range(xn):
for i1 in range(xn):
y[i1,i0]=f3(x0[i0],x1[i1])
xx0,xx1=np.meshgrid(x0,x1) # 分辨率50*50。contour:轮廓,外形。clabel:等高线。format:fmt格式化。
plt.figure(1,figsize=(4,4))
cont=plt.contour(xx0,xx1,y,5,colors='black') # plt.contour用于绘制等高线。5:显示的高度有5个等级,等高线为黑色。返回值保存在con中.
# 传入整数时,等高线的条数;
cont.clabel(fmt='%.2f',fontsize=8) # cont.clabel。fmt:写入文件的格式保留两位小数。fontsize:字体大小。
plt.xlabel('$x_0$',fontsize=14)
plt.ylabel('$x_1$',fontsize=14)
plt.show()
显示:
重要函数:
1.调用函数:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
图像在jupyter中显示
2.np.random.seed(x):
用于指定随机数,无需赋值给谁,为了方便复现。
3.np.arange(a,b,n)与np.linspace(a,b,n):
np.arange(a,b,n):以n为间距,[a,b)区间。左闭右开。
np.linspace(a,b,n):[a,b]闭区间,共n个数字。左闭右闭。
4.np.round(x)与np.round(x,n):
np.round(x):对x所有元素四舍五入为整数。
np.round(x,n):对x所有元素四舍五入,保留n位有效数字。
5.np.exp():
指数函数,()内为指数
6.二维函数绘制与优化:
plt.plot(x,y,color=“r”,label=“
w
=
2
w=2
w=2”) 创建图形,该线条过x,y对应的点。颜色为“red”,标题为“w=2”
plt.legend(loc=“upper left”) #显示图例:upper,lower,left,right legend:传说,说明,标注。
plt.ylim(n1,n2) :设置并返回图像中y轴的范围
plt.ysticks((0,1)):设置y轴的刻度为0,1.
plt.title(“
名字
名字
名字”) :标题,位于正上方。
plt.xlabel(“
x
轴标签
x轴标签
x轴标签”) :x轴标签,x轴正下方。
plt.xlabel(“
y
轴标签
y轴标签
y轴标签”) :y轴标签,y轴正下方。
plt.grid(True) :显示网格线。
plt.grid(False):不显示网格线。默认不显示。
plt.show():显示图像。
7.并列显示多张图:
plt.figure(1,figsize=(w,h)) :创建画板1,不指定大小为方形画板,指定整个绘制区域的大小,宽度w,高度h。
plt.subplot(n1,n2,n):用于直接指定划分方式和位置进行绘图。将画板分割成n1行,n2列后的第n个区域。其编号顺序为 左上为1,右下为最末尾。
注:与矩阵定义顺序相同。plt.subplot(n1,n2,n)中的n为从1开始的。
plt.subplots_adjust(wspace=w,hspace=h):调节一块画板中两相邻区域的横向间隔与纵向间隔。放在哪都行。
8.1用颜色表示数值:(像素图)
plt.gray():灰色色调。
plt.pcolor(y):显示矩阵y的颜色。
plt.colorbar() :显示矩阵色阶。(不同颜色的标准数值)
8.2用颜色表示数值:(三维立体图surface)
from mpl_toolkits.mplot3d import Axes3D :从mpl_toolkits.mplot3d库引入Axes3D函数。
X,Y=np.meshgrid(x0,x1) :构建网格坐标矩阵,大小与目标矩阵y相同。
ax=plt.subplot(111,projection=‘3d’) :子图类型3D(常见3D图,极点图,默认线型图)
ax.plot_surface(X,Y,y,rstride=1,cstride=1,alpha=0.5,color=‘blue’,edgecolor=‘black’)
画出3D图,x横坐标,y纵坐标,z函数值;rstride:曲面上网格行之间的跨度;cstride:曲面上网格列之间的跨度。用于指定纵轴横轴每隔几个元素绘制一条线。数值越小采样点越多。alpha用0-1的实数指定透明度,1不透明。edgecolor:网格线的颜色
surface:表面,使显露。rstride:每个方向的采样步幅。cstride:控制列采样。subplot创建网格,将多个图滑倒一个平面上。plot:画出v,情节n。
ax.set_zticks((0,1)):将z轴刻度显示限定为0,1
ax.view_init(变量1,变量2):调节三维图形的方向,变量1为纵向的旋转角度,变量2为横向的旋转角度。
8.3用颜色表示数值:(等高线)
cont=plt.contour(xx0,xx1,y,5,colors=‘black’):plt.contour用于绘制等高线。横坐标,纵坐标,函数值。5:显示的高度有5个等级,等高线颜色为黑色。返回值保存在cont中。传入整数时,表示等高线的近似条数。
cont.clabel(fmt=‘%.2f’,fontsize=8):等高线的标注,fmt:写入文件的格式保留两位小数。fontsize:字体大小。
9.plt.quiver(a,b,c,d):风场箭头图:(a,b)为点的坐标,(c,d)为箭头的方向。箭头的方向是梯度的方向,上升最快的方向;箭尾的方向是地势低的方向。斜面越陡,箭头越长。
单词:
matplotlab:matrix:矩阵。plot:v绘制。lab:实验室。
seed:种子
random:随机的
range:范围
np.array:array:数组,一系列。dimensionality:维度。ndarray:多维数组。
linspace:linear space:线性等分向量。
round:大概,四舍五入。
plot:v绘制。n情节
label:标签
cornflowerblue:矢车菊蓝色。corn:谷子。
legend:n传说。图片的文字说明。
ylim:limit:限制,边界。
grid:网格,栅栏。
subplot:subroutine:子程序。表示画板中的子画板分割。
plt.subplots_adjust:adjust:v调整
wspace:width宽度
hspace:high高度
len():length长度
ans:answer答案
figsize:figure:v绘图 n数字,数学图形,(书中)图、表。size:大小,尺寸
gray:灰色
pcolor:伪色彩。pseudo:假的伪装的。
colorbar:色阶。bar:n酒吧,条状物。
surface:曲面,表面
mpl_toolkits.mplot3d:tool:kit:成套工具。
Axes3D:axes坐标轴
meshgrid:产生格点矩阵。mesh:v生成网格 n网状物,网络
projection:n投射,投影。project:n项目,v投射,推算
zticks:tick:标记、刻度
view_init:view图像,initialization:初始化
contour:n轮廓,等高线。