将长方体绘制成图像

时间:2016-08-03 00:45:33

标签: python matplotlib

我正在从PHP迁移重要的应用程序到Python。一切都很顺利,除了一个我似乎无法深入了解的特殊问题。

旧的应用程序使用PHP库Image_3D为图像绘制一些长方体(SVG,虽然这并不重要),并将它们显示在网页上。

除了成像之外,我几乎将所有内容迁移到Flask(带有SQLAlchemy)。我已经尝试matplotlibvpython并且几乎非常绝望地达到OpenGL绑定。

这就是PHP目前提供的几个例子:

http://www.offblast.si/content/vulcan/cut/11001/11001.svg

http://www.offblast.si/content/vulcan/cut/11297/11297.svg

即使在极端情况下,您仍可以看到它仍然可读。

我对Python的最佳尝试做得相当糟糕:

http://www.offblast.si/vulcan_env/vulcan/6968.png

http://www.offblast.si/vulcan_env/vulcan/6081.png

图像完全不可读。我没有填写内容,因为坦率地说,没有任何意义 - 你无法做出任何结论。无论高度或方位角如何,任何使用ax.init_view修复视图的尝试都会更糟。

代码只是一堆用

渲染的点
fig = plt.figure(frameon=False)

ax = fig.gca(projection='3d')
ax.set_axis_off()
ax.set_aspect('equal')
ax.plot_wireframe(points[:, 0], points[:, 1], points[:, 2], color="b")

plt.savefig(filename, bbox_inches='tight', pad_inches=0)

我确定我做错了什么,但我无法弄清楚如何使可读渲染在Python / matplotlib中工作,或者是否有不同的库更适合这项任务。

更新1

在我看来,我还没有正确地描述问题 - 它是背包问题的业务限制子集。因此任意定位容器和长方体。可视化模块接收尺寸和位置以及渲染它们的需要。前面例子的规律性只是一阶优化解决方案,经常被发现,但在大多数情况下都没有。

更多示例说明:

http://www.offblast.si/content/vulcan/cut/123241/123241.svg

http://www.offblast.si/content/vulcan/cut/124298/124298.svg

更新2

matplotlib的更好解决方案,下面给出答案。让MPL旋转整个图表以显示有用的概述似乎并不容易。 ax.view_init应允许更改高度,但似乎FOV对于如此狭窄的绘图而言太宽,而它所做的只是稍微改变边缘。

http://www.offblast.si/vulcan_env/vulcan/7489.png

1 个答案:

答案 0 :(得分:1)

你可以使用matplotlib的VPython。在matplotlib中,我会为你的条形使用一个3d框,而对于框架使用另一个框,并关闭轴。这是一个例子:

enter image description here

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

fig = plt.figure()
ax = fig.add_subplot(111, projection = "3d")

ax.autoscale(enable=False)

xpos = np.arange(5)
ypos = np.zeros(5)
zpos = np.zeros(5)

dx = np.ones(5)
dy = 5*np.ones(5)
dz = 5 + 5*np.random.random(5)

colors = ['r', 'c', 'g', 'y', 'm']
ax.bar3d(xpos, ypos, zpos, dx, dy, dz, color=colors, alpha=1)
ax.bar3d(0, 0, 0, 5, 5, 25, color=(1, 1, 1, 0))

ax.set_axis_off()
plt.show()