开发者学堂课程【Python 常用数据科学库:3D 图绘制】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/546/detail/7507
3D 图绘制
在之前研究的都是如何去画二维的图像,在二维图像中加以为就是 3D 图像。如何绘制 3D 图像,首先先把工具导入,需要注意的是在此处需要多导入一个画 3D 图的工具。方法如下:
首先构造一个二维图的表达,在进行改变。把二维的东西进行改变就要用导进来的工具,将其进行改变,将二维转化为三维。首先构造 X 和 Y:
x = np. arange (-4,4,0. 25)
y = np.arange(-4,4,0.25)
X.Y = np.meshgrid(x,y)
2维只需要覆盖点,3维就需要覆盖到2维当中的每一个点,也就是需要一个网格才能更方便地画3D图像:
Z = np.sin(np.sqrt(x**2+y**2))
接下来可以绘制3D 平面,面里需要 XYZ 3个空间,还需要花步长,也就是密度,把图画得更好看,就可以再指定一个 C map。
import matplotlib.pyplot as pltimport nunpy as npfrom mpl_toolkits.mplot3d import Axes30
fig =plt.figure()
ax = Axes3D(fig)
x = np. arange (-4,4,0. 25)
y = np.arange(-4,4,0.25)
X.Y = np.meshgrid(x,y)
Z = np.sin(np.sqrt(x**2+y**2))
ax. plot_surface(X.y,Z,rstride = 1,cstride = 1,cmap='rainbox')plt.show
输入以上代码之后,系统提示 Z 没有被定义,更改 Z 的大小写之后出现如下图像:
该图像也就是把2维图做了一个转化,转化到了3维中。要画3维的图像,就需要如下步骤:
首先,把工具导入:
Import matplotlib.pyplot as plt
fron mpl_toolkits.mplot3d import Axes3D
然后画出3维图像的面:
fig=plt.figure()
ax = fig.add_subplot(111,projectfon ='3d')
plt. show
接下来再画3维图像,将 figure 进行导入,指定一个 projection ,之后传入数据:
fig =plt.figure()
ax = fig gca(projection='3d')
theta = np. linspace (-4*np.pi. np.pi, 4,100)
z = np.linspace(-2. 2. 100)
r=Z**2
x=r*np.sin(theta)
y=r*np.cos(theta)
ax.plot(x,y,z)
plt.show()
图像
如下:
基本步骤就是指定对象是3D 格式,在对象当中传入3维,就可以了。在3维当中也可以画散点图画法和2维相同,只是原来画两个轴线,现在画三个轴。首先将工具导入, Define 一个函数,这个函数就会返回一个随机值,传入最小值最大值和随机值。最后返回,代码如下:
np.randon.seed(1)
def randrange(n,vnin,vnax):
return (vmax vnin)*np.randon rand(n)+vmin
指定画的点数,并且指定画几种不同颜色的值,分别指定他的位置取值范围,把 X 的值和 Y 的值还有 Z 的值分别拿出来。刚才写的函数就会产生随机的数。有最大值和最小值,可以自己指定,最后把图画出来。传入 XYZ。指定 Color 和 marker,
运行代码之后发现错误,修改代码类型之后,总代码如下:
np.randon.seed(1)
def randrange(n,vnin,vnax):
return (vmax vnin)*np.randon rand(n)+vmin
fig =plt.firure()
ax =fig_add_subplot (111,projection * '3d')
n·=100
for c,mzlox,zhigh in [('r','o',50,-25), ('b','x','-30','-5')]:
xs * randrange (n, 23, 32)
ys * randrange (n,0, 100)
zs * randrange(n,int (zlox),Int (zhigh))
ax. scatter(xs, ys,z5, c*c,marker*n)
plt.show()
以上方法就是在三维图中将散点图画出来。
3维的东西总是立体的,立体的东西就可以。全转,所以可以加入代码:ax.view_init(20,0)
输入代码之后就可以,随时改变角度,只需要改变2个值,对着用户的位置就不断发生变化。如果需要画一个三维条形图,方法也相似:
插入一个 for 循环,Z 是指标,C 是颜色:
fig =plt.figure()
ax = fig.add_subplot(111, projection='3d')
for c, z in zip(['r','g','b','y'],[30. 20. 10. 0]):
指定 X 数据和 Y 数据:
xs = np.arange (20)
ys = np. randon. rand(20)
开始画图, 传入XYZ的数据:
ax.bar(xs,ys,zs = z)
plt.show()
进行绘画之后,发现图表较为奇怪,所以对以上代码进行更改,总代码如下:
fig =plt.figure()
ax = fig.add_subplot(111, projection='3d')
for c, z in zip(['r','g','b','y'],[30. 20. 10. 0]):
xs = np.arange (20)
ys = np. randon. rand(20)
ax.bar(xs,ys,zs = z,zdir=’y’)
plt.show()
指定 ZDIR。不同的指定,图像就不同,继续为图像加上颜色。代码如下:
fig =plt.figure()
ax = fig.add_subplot(111, projection='3d')
for c, z in zip(['r','g','b','y'],[30. 20. 10. 0]):
xs = np.arange (20)
ys = np. randon. rand(20)
cs=[c]*len(xs)
ax.bar(xs,ys,zs = z,zdir=’y’,color=cs.alpha=0.5)
plt.show()
以上代码就是基本条形图的画法。
在之前一个单元格就是1*1的,如果指定 rstride 为2,单元格位置就发生变化,将他指定的数值变大一点就可以明显看出差别。原来是11的,在原来面上有很多东西,将其数值变大之后,面上就空旷了,所以其类似于每一个格的密度。代码中将图像的投影画出,只需要加入代码:ax.countour(X,Y,Z,zdim=’z’,offset=-2,cmap=’rainbow’),
此时需要注意大小写,生成如下:
对范围进行限制为负2到2,只需要加入代码:ax.set_zlim(-2,2)
,以上就是画3维图的方法。