如何使用三角形顶点坐标(每个三角形 9 个数字)在 matplotlib 中绘制 3d 三角形?
How to plot 3d triangles in matplotlib with triangles vertices's coordinates (9 numbers for each triangle)?
我有很多三角形(比如 N=10^6),每个三角形顶点的 (x,y,z) 坐标存储在一个文件中。所以每个三角形都有 9 个数字作为一行存储在文件中。因此文件有 N 行。现在我只想绘制(在 3d 中)所有填充了某种颜色的三角形。三角形可能相邻也可能不相邻。我对浏览 matplotlib 文档感到非常困惑。请帮忙。请不要骂我。
在最多 100 万像素的图上绘制 1000 万个三角形可能没有太大意义。无论如何,如果您没有关于哪个顶点与哪个顶点相邻的信息,则不能直接使用 plot_trisurf
方法。
我看到两个选项:
- 绘制一个
Poly3DCollection
.
- 过滤数据中的唯一点并将其提供给
plot_trisurf
。使用此方法,您可能无法根据自己的意愿为三角形着色,而只能根据 z 值着色。
以下是关于如何根据输入数据绘制 Poly3DCollection 的示例。为了演示起见,我们首先需要提供一些示例数据(这需要是提问者的职责,而不是回答者的职责)。
import numpy as np
np.set_printoptions(threshold='nan')
phi = np.linspace(0,2*np.pi, 7)
x = np.cos(phi) + np.sin(phi)
y = -np.sin(phi) + np.cos(phi)
z = np.cos(phi)*0.12+0.7
a = np.zeros((len(phi)-1, 9))
a[:,0] = x[:-1]
a[:,1] = y[:-1]
a[:,2] = z[:-1]
a[:,3:6] = np.roll( a[:,0:3], -1, axis=0)
a[:,8] = np.ones_like(phi[:-1])
a = np.around(a, 2)
print a
打印
[[ 1. 1. 0.82 1.37 -0.37 0.76 0. 0. 1. ]
[ 1.37 -0.37 0.76 0.37 -1.37 0.64 0. 0. 1. ]
[ 0.37 -1.37 0.64 -1. -1. 0.58 0. 0. 1. ]
[-1. -1. 0.58 -1.37 0.37 0.64 0. 0. 1. ]
[-1.37 0.37 0.64 -0.37 1.37 0.76 0. 0. 1. ]
[-0.37 1.37 0.76 1. 1. 0.82 0. 0. 1. ]]
(每组 3 列属于一个点,第一列是 x,第二列是 y,第三列是 z)。
现在我们可以实际构建 Poly3D 集合了。
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
fc = ["crimson" if i%2 else "gold" for i in range(a.shape[0])]
poly3d = [[ a[i, j*3:j*3+3] for j in range(3) ] for i in range(a.shape[0])]
ax.add_collection3d(Poly3DCollection(poly3d, facecolors=fc, linewidths=1))
ax.set_xlim(-1.5,1.5)
ax.set_ylim(-1.5,1.5)
plt.show()
我有很多三角形(比如 N=10^6),每个三角形顶点的 (x,y,z) 坐标存储在一个文件中。所以每个三角形都有 9 个数字作为一行存储在文件中。因此文件有 N 行。现在我只想绘制(在 3d 中)所有填充了某种颜色的三角形。三角形可能相邻也可能不相邻。我对浏览 matplotlib 文档感到非常困惑。请帮忙。请不要骂我。
在最多 100 万像素的图上绘制 1000 万个三角形可能没有太大意义。无论如何,如果您没有关于哪个顶点与哪个顶点相邻的信息,则不能直接使用 plot_trisurf
方法。
我看到两个选项:
- 绘制一个
Poly3DCollection
. - 过滤数据中的唯一点并将其提供给
plot_trisurf
。使用此方法,您可能无法根据自己的意愿为三角形着色,而只能根据 z 值着色。
以下是关于如何根据输入数据绘制 Poly3DCollection 的示例。为了演示起见,我们首先需要提供一些示例数据(这需要是提问者的职责,而不是回答者的职责)。
import numpy as np
np.set_printoptions(threshold='nan')
phi = np.linspace(0,2*np.pi, 7)
x = np.cos(phi) + np.sin(phi)
y = -np.sin(phi) + np.cos(phi)
z = np.cos(phi)*0.12+0.7
a = np.zeros((len(phi)-1, 9))
a[:,0] = x[:-1]
a[:,1] = y[:-1]
a[:,2] = z[:-1]
a[:,3:6] = np.roll( a[:,0:3], -1, axis=0)
a[:,8] = np.ones_like(phi[:-1])
a = np.around(a, 2)
print a
打印
[[ 1. 1. 0.82 1.37 -0.37 0.76 0. 0. 1. ]
[ 1.37 -0.37 0.76 0.37 -1.37 0.64 0. 0. 1. ]
[ 0.37 -1.37 0.64 -1. -1. 0.58 0. 0. 1. ]
[-1. -1. 0.58 -1.37 0.37 0.64 0. 0. 1. ]
[-1.37 0.37 0.64 -0.37 1.37 0.76 0. 0. 1. ]
[-0.37 1.37 0.76 1. 1. 0.82 0. 0. 1. ]]
(每组 3 列属于一个点,第一列是 x,第二列是 y,第三列是 z)。
现在我们可以实际构建 Poly3D 集合了。
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
fc = ["crimson" if i%2 else "gold" for i in range(a.shape[0])]
poly3d = [[ a[i, j*3:j*3+3] for j in range(3) ] for i in range(a.shape[0])]
ax.add_collection3d(Poly3DCollection(poly3d, facecolors=fc, linewidths=1))
ax.set_xlim(-1.5,1.5)
ax.set_ylim(-1.5,1.5)
plt.show()