使用Matplotlib绘制3d图形

目录

一:绘制一个正方体

二:绘制一个3*3*3魔方


为了绘制立体,主要用到Matplotlib中的一个函数voxels

voxels([x, y, z, ], filled, facecolors=None, edgecolors=None, **kwargs)
绘制一组填充体素,所有体素在坐标轴上绘制为1x1x1立方体,filled[0, 0, 0]的lower corner位于原点。被遮挡的面不再绘制。

一:绘制一个正方体

   # 准备一组体素坐标
    n_voxels = np.ones((1,1,1), dtype=bool)

    # 绘制
    ax = plt.figure().add_subplot(projection='3d')
    ax.voxels(n_voxels)
    plt.show()

二:绘制一个3*3*3魔方

(1) 填充体素,绘制

  n_voxels = np.ones((3,33), dtype=bool)

    # 绘制
    ax = plt.figure().add_subplot(projection='3d')
    ax.voxels(n_voxels)
    plt.show()

(2)增加间隙

可以对3x3x3的体素进行上采样,即构建一个5x5x5的体素,这样在每一个维度,让处于两个体素中间的体素不显示,即可产生间隙的效果。

    # 准备一组体素坐标
    n_voxels = np.ones((3,3,3), dtype=bool)

    size = np.array(n_voxels.shape) * 2
    filled = np.zeros(size - 1, dtype=n_voxels.dtype)
    filled[::2, ::2, ::2] = n_voxels


    # 绘制
    ax = plt.figure().add_subplot(projection='3d')
    ax.voxels(filled)
    plt.show()
 

(3)缩小间隙,保持美观

   # 准备一组体素坐标
    n_voxels = np.ones((3,3,3), dtype=bool)

    size = np.array(n_voxels.shape) * 2
    filled = np.zeros(size - 1, dtype=n_voxels.dtype)
    filled[::2, ::2, ::2] = n_voxels

    # 缩小间隙
    # 构建voxels顶点控制网格
    # x, y, z均为6x6x6的矩阵,为voxels的网格
    # //2是为了,把索引范围从[0 1 2 3 4 5]转换为[0 0 1 1 2 2],这样x,y,z范围就回到了0~3
    x, y, z = np.indices(np.array(filled.shape) + 1).astype(float) // 2
    x[1::2, :, :] += 0.95
    y[:, 1::2, :] += 0.95
    z[:, :, 1::2] += 0.95

    # 绘制
    ax = plt.figure().add_subplot(projection='3d')
    ax.voxels(x, y, z,filled)
    plt.show()

(4)绘制面颜色

由于只能给每个体素整体一个颜色,不能对一个体素的不同面指定不同的颜色,所以为了实现六个面不同颜色,只能将3x3x3的矩阵改为5x5x5,将最外边的那一层体素厚度设小一点,近似于面,然后赋颜色。

 # 准备一组体素坐标
    n_voxels = np.ones((5,5,5), dtype=bool)

    size = np.array(n_voxels.shape) * 2
    filled = np.zeros(size - 1, dtype=n_voxels.dtype)
    filled[::2, ::2, ::2] = n_voxels

    # 缩小间隙
    # 构建voxels顶点控制网格
    # x, y, z均为6x6x6的矩阵,为voxels的网格
    # //2是为了,把索引范围从[0 1 2 3 4 5]转换为[0 0 1 1 2 2],这样x,y,z范围就回到了0~3
    x, y, z = np.indices(np.array(filled.shape) + 1).astype(float) // 2
    x[1::2, :, :] += 0.95
    y[:, 1::2, :] += 0.95
    z[:, :, 1::2] += 0.95

    x[0, :, :] += 0.94
    y[:, 0, :] += 0.94
    z[:, :, 0] += 0.94
    x[-1, :, :] -= 0.94
    y[:, -1, :] -= 0.94
    z[:, :, -1] -= 0.94

    # 给魔方六个面赋予不同的颜色
    colors = np.array(['#ffd400', "#fffffb", "#f47920", "#d71345", "#145b7d", "#45b97c"])
    facecolors = np.full(filled.shape, '#77787b')  # 设一个灰色的基调
    facecolors[:, :, -1] = colors[0]
    facecolors[:, :, 0] = colors[1]
    facecolors[:, 0, :] = colors[2]
    facecolors[:, -1, :] = colors[3]
    facecolors[0, :, :] = colors[4]
    facecolors[-1, :, :] = colors[5]

    filled[0, 0, :] = 0
    filled[0, -1, :] = 0
    filled[-1, 0, :] = 0
    filled[-1, -1, :] = 0
    filled[:, 0, 0] = 0
    filled[:, 0, -1] = 0
    filled[:, -1, 0] = 0
    filled[:, -1, -1] = 0
    filled[0, :, 0] = 0
    filled[0, :, -1] = 0
    filled[-1, :, 0] = 0
    filled[-1, :, -1] = 0

    # 绘制
    ax = plt.figure().add_subplot(projection='3d')
    ax.voxels(x, y, z,filled,facecolors=facecolors)
    plt.show()
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/412357.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dubbo入门案例!!!

入门案例之前我们先介绍一下:zookeeper。 Zookeeper是Apacahe Hadoop的子项目,可以为分布式应用程序协调服务,适合作为Dubbo服务的注册中心,负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只…

Linux shell美化 zsh+oh-my-zsh+power10k

文章目录 安装zsh安装on-my-zsh安装power10k主题安装power10k将oh-my-zsh主题改为power10k字体 设置安装字体配置字体 power10k配置相关插件安装zsh-autosuggestionszsh-syntax-highlighting安装插件完成,重新加载配置文件 美化效果示意: 安装zsh 安装…

华为设备NAT的配置

实现内网外网地址转换 静态转换 AR1: sys int g0/0/0 ip add 192.168.10.254 24 int g0/0/1 ip add 22.33.44.55 24 //静态转换 nat static global 22.33.44.56 inside 192.168.10.1 动态转换 最多有两台主机同时访问外网 AR1: sys int g0/0/0 ip add…

动态住宅代理IP是什么?如何配置使用?

动态住宅代理IP,作为一种高效的网络工具,不仅能够为您的在线活动提供额外的保护层,还能增强匿名性和数据安全。接下来将深入探讨动态住宅代理IP的定义、设置步骤、以及它如何有效保护您的网络隐私和安全。 一、动态住宅代理是什么&#xff1f…

基于改进蝙蝠算法的三维航线规划算法

matlab2020a可正常运行 基于改进蝙蝠算法的三维航线规划资源-CSDN文库

BRC20通证的诞生与未来展望!如何导入bitget教程

BRC-20通证是什么? 嘿!你知道BRC-20通证吗?这可是比特币区块链上的超级明星!它们不依赖智能合约,而是把JSON代码刻在聪上,聪可是比特币的最小单位哦!就像在比特币的乐高积木上盖房子&#xff0…

“重大利好”!以太坊坎昆升级临近!Layer2新玩家Blast不断蚕食市场份额,令竞品汗流浃背?

1月17日,坎昆升级(Dencun)率先在以太坊Goerli测试网启动,由于Goerli是参与者数量以及网络负载程度最高的测试网,仅次于以太坊主网,因此如果没什么问题,预示着主网升级已经不远。 而现在&#xf…

文件重命名方法:不同路径的文件名大小写如何批量转换技巧

在文件管理中,经常要处理文件重命名的问题,尤其是涉及到不同路径下的文件名大小写转换时。下面来看云炫文件管理器如何批量转换文件名的大小写的技巧,轻松完成这项任务。 准备多个不同路径文件夹,在里面各放几个文件。接下来开始…

重置aws上的ssh默认登录端口

aws上的ec2机器,默认ssh的登录都是22,为了防止被黑,记录下修改该默认端口的方法 修改/etc/ssh/sshd_config文件,将Port 22注释去掉在上面的文件中,加入一行,你想要增加的端口号,格式和22一致注意&#xff1…

opengauss-高斯数据库的安装部署及MySQL数据迁移实战.

目录 介绍 下载安装包 安装 1.设置SEMMNI 2.新建用户和用户组 3.下载安装包解压 4.安装数据库 5.修改配置 6.重启服务 数据库使用 gsql命令和常用sql 1.使用omm用户连接数据库-本地登陆无需输入密码: 2.查看用户信息 3.删除数据库 4.创建用户 5.创建…

adb wifi 远程调试 安卓手机 命令

使用adb wifi 模式调试需要满足以下前提条件: 手机 和 PC 需要在同一局域网下。手机需要开启开发者模式,然后打开 USB 调试模式。 具体操作步骤如下: 将安卓手机通过 USB 线连接到 PC。(连接的时候,会弹出请求&#x…

Spring框架面试题

目录 1.Spring中bean的生命周期 2.Spring中bean的循环依赖 3.SpringMVC执行流程 4.Springboot自动装配原理 5.Spring框架常见注解(Spring、Springboot、SpringMVC) 6.mybatis执行流程 7.mybatis延迟加载使用及原理 8.mybatis一级、二级缓存 1.Spring中bean的生命周期 2.…