西电-数据可视化-实验三-空间数据可视化
一、实验内容
在3D空间中绘制以下图形:
-
螺旋曲线(半径为5,每旋转一周z坐标增加π)
-
二元正态分布曲面
-
球面(半径为5)
二、解决思路:
1. 螺线曲线:
(1)螺旋曲线的方程:
本例中半径r = 5, Δz = kwT = kw2Π/w = 2Π*k = Π => k = 0.5
(2)进入pyecharts官网修改demo即可:(3)代码实现:
import numpy as np
import pyecharts.options as opts
from pyecharts.charts import Line3D
def draw_spiral_curve():
spiral_list = []
for wt in np.arange(0, 20*np.pi, np.pi/20):
x = 5*np.cos(0.5*wt)
y = 5*np.sin(0.5*wt)
z = 0.5*wt
spiral_list.append([x, y, z])
(
Line3D()
.add(
series_name="螺旋曲线",
data=spiral_list,
xaxis3d_opts=opts.Axis3DOpts(type_="value"),
yaxis3d_opts=opts.Axis3DOpts(type_="value"),
zaxis3d_opts=opts.Axis3DOpts(type_="value"),
shading="color",
grid3d_opts=opts.Grid3DOpts(
width=100,
height=100,
depth=100,
is_rotate=True,
rotate_speed=10,
rotate_sensitivity=1,
)
)
.set_global_opts(
visualmap_opts=opts.VisualMapOpts(
min_=-1,
max_=1
)
)
.render("spiral_curve.html")
)
if __name__ == '__main__':
draw_spiral_curve()
(4)效果图:
2.二元正态分布曲面:
(1)二元正态分布曲面的方程:
简化处理:如果X与Y独立=>ρ=0,这时方程如下:
(2)进入pyecharts官网修改demo即可:
(3)代码实现:
import numpy as np
import pyecharts.options as opts
from pyecharts.charts import Surface3D
# 预置二维正态分布的参数
sigma_1 = 15
sigma_2 = 15
u_1 = 0
u_2 = 0
A = 40
def draw_gaussian():
data = []
for i in np.arange(-40, 40, 0.1):
for j in np.arange(-40, 40, 0.1):
x = i
y = j
z = A * pow(np.e, -(pow(x - u_1, 2) / pow(sigma_1, 2) + pow(y - u_2, 2) / pow(sigma_2, 2)) / 2.0)
data.append([x, y, z])
data = list([[elem[1], elem[0], elem[2]] for elem in data])
(
Surface3D()
.add(
series_name="二维正态分布曲面",
data=data,
xaxis3d_opts=opts.Axis3DOpts(
type_="value",
),
yaxis3d_opts=opts.Axis3DOpts(
type_="value",
),
zaxis3d_opts=opts.Axis3DOpts(
type_="value",
),
shading="color",
grid3d_opts=opts.Grid3DOpts(
width=100,
height=100,
depth=100,
is_rotate=True,
rotate_speed=10,
rotate_sensitivity=1,
),
)
.set_global_opts(
visualmap_opts=opts.VisualMapOpts(
type_="color",
min_=-1,
max_=1,
)
)
.render("gaussian.html")
)
if __name__ == '__main__':
draw_gaussian()
(4)效果图:
3.球面:
(1)球面方程:
(2)进入pyecharts官网修改demo即可:
(3)实验代码:
import numpy as np
import pyecharts.options as opts
from pyecharts.charts import Surface3D
def draw_ball():
ball_list = []
# 球坐标
for fai in np.arange(0, np.pi, np.pi / 50):
for seita in np.arange(0, 2 * np.pi, np.pi / 200):
x = 5 * np.sin(fai) * np.cos(seita)
y = 5 * np.sin(fai) * np.sin(seita)
z = 5 * np.cos(fai)
ball_list.append([x, y, z])
(
Surface3D()
.add(
series_name="球面",
shading="color",
data=ball_list,
xaxis3d_opts=opts.Axis3DOpts(type_="value"),
yaxis3d_opts=opts.Axis3DOpts(type_="value"),
grid3d_opts=opts.Grid3DOpts(
width=100,
height=100,
depth=100,
is_rotate=True,
rotate_speed=10,
rotate_sensitivity=1,
),
)
.set_global_opts(
visualmap_opts=opts.VisualMapOpts(
min_=-1,
max_=1,
)
)
.render("ball.html")
)
if __name__ == '__main__':
draw_ball()
(4)效果图: