西电-数据可视化-实验三-空间数据可视化(pyecharts)

西电-数据可视化-实验三-空间数据可视化

一、实验内容

在3D空间中绘制以下图形:

  1. 螺旋曲线(半径为5,每旋转一周z坐标增加π)

  2. 二元正态分布曲面

  3. 球面(半径为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)效果图:
在这里插入图片描述

Guess you like

Origin blog.csdn.net/yyyyypppppzzzzz/article/details/121317550