python的matplotlib的3种正方体的画法及代码分析

1 说明:

1.1 适合收藏,纯技术性探讨,适合孩子对正方体的认识和自己对编程代码的熟悉。

1.2 python3.8和matplotlib版本问题。

1.3 推荐指数:★★


python的matplotlib的3种正方体的画法及代码分析

2 无numpy法

2.1 代码:

<code># -*- coding: utf-8 -*-

from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def cube(x, y, z, dx, dy, dz):
fig = plt.figure()
#ax设置背景颜色facecolor='black'为黑色
ax = Axes3D(fig,facecolor='black')

xx = [x, x, x+dx, x+dx, x]
yy = [y, y+dy, y+dy, y, y]

#底的四条边
ax.plot3D(xx, yy, [z] )
#顶的四条边
ax.plot3D(xx, yy, [z+dz])

#四条柱或者高
ax.plot3D([x, x], [y, y], [z, z+dz])
ax.plot3D([x, x], [y+dy, y+dy], [z, z+dz])
ax.plot3D([x+dx, x+dx], [y+dy, y+dy], [z, z+dz])
ax.plot3D([x+dx, x+dx], [y, y], [z, z+dz])

#坐标及其刻度隐藏
plt.axis('off')
plt.show()

if __name__ == "__main__":
#边长100=100=100,正方体
cube(0, 0, 0, 100, 100, 100)
/<code>

2.2 图:


python的matplotlib的3种正方体的画法及代码分析

3 numpy的full_like法

3.1 代码:

<code># -*- coding: utf-8 -*-
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

#x,y,z是起点坐标,dx,dy,dz是50为边长=长宽高
def numpy_cube_one(x=0, y=0, z=0, dx=50, dy=50, dz=50):
fig = plt.figure(facecolor='black')
#ax = fig.add_subplot(1, 1, 1, projection='3d',facecolor='black')
#等于下面的这个
ax = Axes3D(fig,facecolor='black')

xx = np.linspace(x, x+dx, 2)
yy = np.linspace(y, y+dy, 2)
zz = np.linspace(z, z+dz, 2)

xx2, yy2 = np.meshgrid(xx, yy)
ax.plot_surface(xx2, yy2, np.full_like(xx2, z))
ax.plot_surface(xx2, yy2, np.full_like(xx2, z+dz))

yy2, zz2 = np.meshgrid(yy, zz)
ax.plot_surface(np.full_like(yy2, x), yy2, zz2)
ax.plot_surface(np.full_like(yy2, x+dx), yy2, zz2)

xx2, zz2= np.meshgrid(xx, zz)
ax.plot_surface(xx2, np.full_like(yy2, y), zz2)
ax.plot_surface(xx2, np.full_like(yy2, y+dy), zz2)
#坐标及其刻度隐藏
plt.axis('off')
plt.title("Cube")
plt.show()

if __name__ == "__main__":
numpy_cube_one()/<code>

3.2 图:


python的matplotlib的3种正方体的画法及代码分析

4 numpy的方法二:

4.1 初始代码,应该比较好理解,但是报错,估计与版本有关

#报错: if Z.ndim != 2:

#AttributeError: 'int' object has no attribute 'ndim'

# ndim返回的是数组的维度,返回的只有一个数,该数即表示数组的维度。

4.2 初始代码:

<code># -*- coding: utf-8 -*-
from matplotlib import pyplot as plt

from mpl_toolkits.mplot3d import Axes3D
import numpy as np

def numpy_cube_two(x=0, y=0, z=0, dx=50, dy=50, dz=50):
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')

xx = np.linspace(x, x+dx, 2)
yy = np.linspace(y, y+dy, 2)
zz = np.linspace(z, z+dz, 2)

#上下底
xx, yy = np.meshgrid(xx, yy)
ax.plot_surface(xx, yy, z)
ax.plot_surface(xx, yy, z+dz)

yy, zz = np.meshgrid(yy, zz)
ax.plot_surface(x, yy, zz)
ax.plot_surface(x+dx, yy, zz)

xx, zz = np.meshgrid(xx, zz)
ax.plot_surface(xx, y, zz)
ax.plot_surface(xx, y+dy, zz)

plt.show()

if __name__ == "__main__":
numpy_cube_two()/<code>

4.3 遇到问题,那就解决问题呗。

<code># -*- coding: utf-8 -*-
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

def numpy_cube_two(x=0, y=0, z=0, dx=50, dy=50, dz=50):
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')

xx = np.linspace(x, x+dx, 2)
yy = np.linspace(y, y+dy, 2)
zz = np.linspace(z, z+dz, 2)

#上下底
xx, yy = np.meshgrid(xx, yy)

#----修改后----

z1=np.ones((1,1))
z2=np.zeros((1,1))
ax.plot_surface(xx, yy, z1)
ax.plot_surface(xx, yy, z2)
#---仍有小bug---

yy, zz = np.meshgrid(yy, zz)
ax.plot_surface(x, yy, zz)
ax.plot_surface(x+dx, yy, zz)

xx, zz = np.meshgrid(xx, zz)
ax.plot_surface(xx, y, zz)
ax.plot_surface(xx, y+dy, zz)

plt.show()

if __name__ == "__main__":
numpy_cube_two()/<code>

4.4 图


python的matplotlib的3种正方体的画法及代码分析

4.5 说明:没有设置背景颜色和去除坐标轴,主要是有一个bug,就是有一个面没有画出,希望有大神指导,谢谢。

5 自己整理出来,仅供学习,欢迎教学相长,一起探讨。


分享到:


相關文章: