- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章python之用Numpy和matplotlib画一个魔方由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
瞎鼓捣系列~ Numpy + matplotlib 画一个魔方 。
。
NumPy是Python科学计算的基本包。它是一个Python库,提供了多维数组对象、各种派生对象(如掩码数组和矩阵),以及用于对数组进行快速操作的各种例程,包括数学、逻辑、形状操作、排序、选择、I/O、离散傅里叶变换、基本线性代数、基本的统计运算,随机模拟等等。 github 官方文档 。
最近项目中有个码垛规划的需求,Numpy中的三维数组特别好用,就鼓捣了一下。 然后我看到桌子上两年前买的魔方,好久没玩儿过了。头脑一热,就想用Numpy画个魔方出来! 。
。
这里选择使用Matplotlib作为可视化工具 。
Matplotlib GitHub Matplotlib 官方文档 。
。
为了制作魔方,主要用到Matplotlib中的一个函数voxels 。
voxels([x, y, z, ]/, filled, facecolors=None, edgecolors=None, **kwargs)绘制一组填充体素所有体素在坐标轴上绘制为1x1x1立方体,filled[0, 0, 0]的lower corner位于原点。被遮挡的面不再绘制。
以3x3x3魔方为例:
import matplotlib.pyplot as pltimport numpy as np# 准备一组体素坐标n_voxels = np.ones((3, 3, 3), dtype=bool)# 绘制ax = plt.figure().add_subplot(projection="3d")ax.voxels(n_voxels)plt.show()
可以看到,虽然出现了3x3x3个体素,但是体素与体素之间的没有间隙,看起来不是很美观.
。
为了让体素与体素之间有间隙,可以对3x3x3的体素进行上采样,即构建一个5x5x5的体素,这样在每一个维度,让处于两个体素中间的体素不显示,即可产生间隙的效果.
size = np.array(n_voxels.shape) * 2filled_2 = np.zeros(size - 1, dtype=n_voxels.dtype)filled_2[::2, ::2, ::2] = n_voxelsax = plt.figure().add_subplot(projection="3d")ax.voxels(filled_2)plt.show()
这样间隙有了,但是间隙太大了,此时可以使用voxels函数的可选参数[x, y, z]控制每一个voxel的顶点位置,进而控制间隙的大小 。
# 缩小间隙# 构建voxels顶点控制网格# x, y, z均为6x6x6的矩阵,为voxels的网格# //2是为了,把索引范围从[0 1 2 3 4 5]转换为[0 0 1 1 2 2],这样x,y,z范围就回到了0~3x, y, z = np.indices(np.array(filled_2.shape) + 1).astype(float) // 2 x[1::2, :, :] += 0.95y[:, 1::2, :] += 0.95z[:, :, 1::2] += 0.95
这样间隙就看起来差不多了,接下来就是为魔方的六个面添加颜色了.
。
由于只能给每个体素整体一个颜色,不能对一个体素的不同面指定不同的颜色,所以为了实现六个面不同颜色,只能将3x3x3的矩阵改为5x5x5,将最外边的那一层体素厚度设小一点,近似于面,然后赋颜色.
import matplotlib.pyplot as pltimport numpy as np# 准备一些坐标n_voxels = np.ones((5, 5, 5), dtype=bool)# 生成间隙size = np.array(n_voxels.shape) * 2filled_2 = np.zeros(size - 1, dtype=n_voxels.dtype)filled_2[::2, ::2, ::2] = n_voxels# 缩小间隙# 构建voxels顶点控制网格# x, y, z均为6x6x8的矩阵,为voxels的网格,3x3x4个小方块,共有6x6x8个顶点。# 这里//2是精髓,把索引范围从[0 1 2 3 4 5]转换为[0 0 1 1 2 2],这样就可以单独设立每个方块的顶点范围x, y, z = np.indices(np.array(filled_2.shape) + 1).astype(float) //2 # 3x6x6x8,其中x,y,z均为6x6x8x[1::2, :, :] += 0.95y[:, 1::2, :] += 0.95z[:, :, 1::2] += 0.95# 修改最外面的体素的厚度,作为六个面来使用x[0, :, :] += 0.94y[:, 0, :] += 0.94z[:, :, 0] += 0.94x[-1, :, :] -= 0.94y[:, -1, :] -= 0.94z[:, :, -1] -= 0.94# 去除边角料filled_2[0, 0, :] = 0filled_2[0, -1, :] = 0filled_2[-1, 0, :] = 0filled_2[-1, -1, :] = 0filled_2[:, 0, 0] = 0filled_2[:, 0, -1] = 0filled_2[:, -1, 0] = 0filled_2[:, -1, -1] = 0filled_2[0, :, 0] = 0filled_2[0, :, -1] = 0filled_2[-1, :, 0] = 0filled_2[-1, :, -1] = 0
然后就是给六个面赋不同的颜色了.
六个方向表示:上(up)、下(down)、左(left)、右(right)、前(front)、后(back) 六种颜色表示:黄色(yellow)、白色(white)、橙色(orange)、红色(red)、蓝色(blue)、绿色(green) 初始的魔方组成形式为:上黄,下白,左橙,右红,前蓝,后绿.
参考:颜色大全https://www.5tu.cn/colors/yansebiao.html 。
# 给魔方六个面赋予不同的颜色colors = np.array(["#ffd400", "#fffffb", "#f47920", "#d71345", "#145b7d", "#45b97c"])facecolors = np.full(filled_2.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]
。
完整 代码如下:
# -*- coding: utf-8 -*-# @Time : DATE:2021/8/29# @Author : yan# @Email : 1792659158@qq.com# @File : blogDemo.pyimport matplotlib.pyplot as pltimport numpy as npdef generate_rubik_cube(nx, ny, nz): """ 根据输入生成指定尺寸的魔方 :param nx: :param ny: :param nz: :return: """ # 准备一些坐标 n_voxels = np.ones((nx + 2, ny + 2, nz + 2), dtype=bool) # 生成间隙 size = np.array(n_voxels.shape) * 2 filled_2 = np.zeros(size - 1, dtype=n_voxels.dtype) filled_2[::2, ::2, ::2] = n_voxels # 缩小间隙 # 构建voxels顶点控制网格 # x, y, z均为6x6x8的矩阵,为voxels的网格,3x3x4个小方块,共有6x6x8个顶点。 # 这里//2是精髓,把索引范围从[0 1 2 3 4 5]转换为[0 0 1 1 2 2],这样就可以单独设立每个方块的顶点范围 x, y, z = np.indices(np.array(filled_2.shape) + 1).astype(float) // 2 # 3x6x6x8,其中x,y,z均为6x6x8 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 # 去除边角料 filled_2[0, 0, :] = 0 filled_2[0, -1, :] = 0 filled_2[-1, 0, :] = 0 filled_2[-1, -1, :] = 0 filled_2[:, 0, 0] = 0 filled_2[:, 0, -1] = 0 filled_2[:, -1, 0] = 0 filled_2[:, -1, -1] = 0 filled_2[0, :, 0] = 0 filled_2[0, :, -1] = 0 filled_2[-1, :, 0] = 0 filled_2[-1, :, -1] = 0 # 给魔方六个面赋予不同的颜色 colors = np.array(["#ffd400", "#fffffb", "#f47920", "#d71345", "#145b7d", "#45b97c"]) facecolors = np.full(filled_2.shape, "#77787b") # 设一个灰色的基调 # facecolors = np.zeros(filled_2.shape, dtype="U7") facecolors[:, :, -1] = colors[0] # 上黄 facecolors[:, :, 0] = colors[1] # 下白 facecolors[:, 0, :] = colors[2] # 左橙 facecolors[:, -1, :] = colors[3] # 右红 facecolors[0, :, :] = colors[4] # 前蓝 facecolors[-1, :, :] = colors[5] # 后绿 ax = plt.figure().add_subplot(projection="3d") ax.voxels(x, y, z, filled_2, facecolors=facecolors) plt.show()if __name__ == "__main__": generate_rubik_cube(3, 3, 3)
可根据输入生成不同尺寸的魔方: 4x4x4
6x6x6 。
甚至是4x4x6,不过这就不是咱平时玩儿的魔方了~ 。
到此这篇关于python之用Numpy和matplotlib画一个魔方的文章就介绍到这了,更多相关Numpy matplotlib画魔方内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/weixin_44456692/article/details/119977172 。
最后此篇关于python之用Numpy和matplotlib画一个魔方的文章就讲到这里了,如果你想了解更多关于python之用Numpy和matplotlib画一个魔方的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我无法在此图中定位轴标签。我喜欢放置顶部标签,使管道与网格对齐,并放置左右标签,以便它们不接触绘图。 我试过了 ax.tick_params(axis='both', which='both'
我使用的是 python 2,下面的代码只是使用了一些示例数据,我的实际数据可能有不同的长度,并且可能不是很细。 import numpy as np import datetime i
给定坐标 [1,5,7,3,5,10,3,6,8]为 matplotlib.pyplot ,如何突出显示或着色线条的不同部分。例如,列表中的坐标 1-3 ( [1,5,7,3] ) 表示属性 a .我
我正在matplotlib中绘制以下图像。 我的问题是,图像看起来像这样,但是,我想使背景变暗,因为当我打印该图像时,灰度部分不会出现在打印物中。有人可以告诉我API进行此更改吗? 我使用简单的API
这是关于matplotlib的一个非常基本的问题,但是我不知道该怎么做: 我想绘制多个图形,并使用绘制窗口中的箭头从一个移到另一个。 目前,我只知道如何创建多个图并将其绘制在不同的窗口中,如下所示:
在 matplotlib 中绘制小块对象时,由于显示分辨率而引入了伪影。使用抗锯齿并不能解决问题。 这个问题有解决方案吗? import matplotlib.pyplot as plt impo
对于直方图,有一个简单的内置选项 histtype='step' .如何制作相同风格的条形图? 最佳答案 [阅读评论后添加答案] 将可选关键字设置为 fill=False对于条形图: import m
我正在尝试在 (6X3) 网格上创建子图。我对图例的位置有疑问。图例对所有子图都是通用的。 lgend 现在与 y 轴标签重叠 我尝试删除 constrained_layout=True 选项。但这在
我有一个带有一些线段( LineCollection )和一些点的图表。这些线和点有一些与它们相关的值,但没有绘制出来。我希望能够添加鼠标悬停工具提示或其他方法来轻松找到点和线的关联值。这对于点或线段
我想创建一个带有对齐不同曲线文本的图例的图。这是一个最小的工作示例: import matplotlib.pyplot as plt import numpy as np x=np.linspace(
可以说我正在用matplotlib绘制一条线并添加一个图例。 在图例中,其显示为------ Label。当绘制较小的图形尺寸以进行打印时,我发现该行的默认水平长度太长。 是否存在将------ La
我正在使用 matplotlib 构建一个 3D 散点图,但无法使生成的图形具有所有 3 个轴的共同原点。我怎样才能做到这一点? 我的代码(到目前为止),我还没有为轴规范实现任何定义,因为我对 Pyt
我有一个我想使用的绘图布局,其中 9 个不同的数据簇被布置在一个方形网格上。网格中的每个框都包含 3 个并排布置的箱线图。 我最初的想法是这将适合 3x3 子图布局,每个单独的子图本身被划分为 3x1
我的图形从y=-1变为y=10 我想在任意位置写一小段文字,例如x=2000,y=5: ax.annotate('MgII', xy=(2000.0, 5.0), xycoords='data')
我想使用LateX格式来构建一个表达式,其中出现一些数字,但这些数字是用LateX表达式中的变量表示的。 实际的目标是在axes.annotate()方法中使用它,但是为了讨论起见,这里是一个原理代码
我需要比较两组的二维分布。 当我使用 matplotlib.pyplot.contourf并覆盖图,每个等高线图的背景颜色填充整个图空间。有没有办法让每个等高线图的最低等高线级别透明,以便更容易看到每
在R中,有一个locator函数,类似于Matlab的ginput,您可以用鼠标单击图形并选择任何x,y坐标。此外,还有一个名为identify(x,y)的函数,如果您给它绘制了一组绘制的点x,y,然
我想用matplotlib生成矢量图。我尽力了-但输出是光栅图像。这是我使用的: import matplotlib matplotlib.use('Agg') import matplotlib.p
我正在尝试使用 matplotlib 制作具有非常小的灰点的散点图。由于点密度的原因,点需要很小。问题是 scatter() 函数的标记似乎既有线条又有填充。当标记很小时,只有线条可见,而看不到填充,
我不太明白为什么我无法在指定的限制内创建水平和垂直线。我想用这个框绑定(bind)数据。然而,双方似乎并没有遵守我的指示。为什么是这样? # CREATING A BOUNDING BOX # BOT
我是一名优秀的程序员,十分优秀!