#!/usr/bin/env python3
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
import mpl_toolkits.mplot3d.art3d as art3d
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# Draw a circle on the x=0 'wall'
p = Circle((5, 5), 3)
ax.add_patch(p)
art3d.pathpatch_2d_to_3d(p, z=0, zdir="x")
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ax.set_zlim(0, 10)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
r = 2 # desired radius
n = 100 # number of points for the circle
x,y,z = 12, 56, 20 # circle center
# Get circle discrete points in z-plane
# Convert to Cartesian coordinates
# Set the 3rd coordinate to a fixed value
points = r*np.exp(1j*np.linspace(0, 2*np.pi, n))
u,v = np.real(points), np.imag(points)
w = np.repeat(r, n)
# Set pyplot configuration
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.set_aspect('equal')
# To plot one circle, just use:
#ax.plot (u+x,v+y,w+z)
# ---------------------------------------------
# # Fancy plot of circles at different locations
from itertools import permutations
perms = set(permutations([0,1,2])).union(permutations([0,1,3]))
coords = [u,v,w,-w]
for idx, idy, idz in perms: ax.plot(coords[idx]+x, coords[idy]+y, coords[idz]+z)
3条答案
按热度按时间ogq8wdun1#
您需要常规导入,以及3D工具包
您需要启用3D的
axes
对象你需要一个圆,包含在平面 y-z 中
现在我们可以画出原始圆,作为一个例子,可以画出绕 z 轴旋转的许多圆,这些圆的圆心也被放置在离 z 轴固定的距离处(等于圆的半径),因此它们与 z 轴相切
最后我们放一个纵轴和一个图例
是时候看看我们的成果了
g6baxovj2#
mpl_toolkits.mplot3d.art3d
https://matplotlib.org/3.2.1/gallery/mplot3d/pathpatch3d.html在注解中提到,该示例可以最小化为:
其给出:
这比https://stackoverflow.com/a/56871467/895245好一点,因为它直接使用了更高级别的
Circle
对象,而不需要显式地绘制线条。不幸的是,matplotlib中的3D支持有点有限,如文档本身所述,您必须做一些额外的工作才能在不平行于主坐标平面的平面上绘制:How can matplotlib 2D patches be transformed to 3D with arbitrary normals?
在matplotlib上测试==3.2.2.
4szc88ey3#
我不知道如何在3D绘图中绘制圆/环。我试图绘制一个与Z轴相切的圆
你也可以
constrained
布局时,它会抛出错误)虽然后一种方法在智力上不是最佳的,但它是解决
Circle
问题的可行方法。然而,当使用Python循环时,迭代所有单独的点可能会很慢。这个答案的变体可以加快速度,并允许直接使用numpy数组操作而不是Python循环来更简洁的代码。