我正在从PHP迁移重要的应用程序到Python。一切都很顺利,除了一个我似乎无法深入了解的特殊问题。
旧的应用程序使用PHP库Image_3D为图像绘制一些长方体(SVG,虽然这并不重要),并将它们显示在网页上。
除了成像之外,我几乎将所有内容迁移到Flask(带有SQLAlchemy)。我已经尝试matplotlib
,vpython
并且几乎非常绝望地达到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
中工作,或者是否有不同的库更适合这项任务。
在我看来,我还没有正确地描述问题 - 它是背包问题的业务限制子集。因此任意定位容器和长方体。可视化模块接收尺寸和位置以及渲染它们的需要。前面例子的规律性只是一阶优化解决方案,经常被发现,但在大多数情况下都没有。
更多示例说明:
http://www.offblast.si/content/vulcan/cut/123241/123241.svg
http://www.offblast.si/content/vulcan/cut/124298/124298.svg
matplotlib
的更好解决方案,下面给出答案。让MPL旋转整个图表以显示有用的概述似乎并不容易。
ax.view_init
应允许更改高度,但似乎FOV对于如此狭窄的绘图而言太宽,而它所做的只是稍微改变边缘。
答案 0 :(得分:1)
你可以使用matplotlib的VPython。在matplotlib中,我会为你的条形使用一个3d框,而对于框架使用另一个框,并关闭轴。这是一个例子:
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()