尝试绘制一条线,将三维子图上的一个点连接到另一个三维子图。在2D中,使用ConnectionPatch很容易做到。我试图模仿here中的Arrow3D类,但没有运气。
我很高兴在这一点上,即使只是一个工作区。例如,在下面的代码生成的图中,我想连接两个绿色。
def cylinder(r, n):
'''
Returns the unit cylinder that corresponds to the curve r.
INPUTS: r - a vector of radii
n - number of coordinates to return for each element in r
OUTPUTS: x,y,z - coordinates of points
'''
# ensure that r is a column vector
r = np.atleast_2d(r)
r_rows, r_cols = r.shape
if r_cols > r_rows:
r = r.T
# find points along x and y axes
points = np.linspace(0, 2*np.pi, n+1)
x = np.cos(points)*r
y = np.sin(points)*r
# find points along z axis
rpoints = np.atleast_2d(np.linspace(0, 1, len(r)))
z = np.ones((1, n+1))*rpoints.T
return x, y, z
#---------------------------------------
# 3D example
#---------------------------------------
fig = plt.figure()
# top figure
ax = fig.add_subplot(2,1,1, projection='3d')
x,y,z = cylinder(np.linspace(2,1,num=10), 40)
for i in range(len(z)):
ax.plot(x[i], y[i], z[i], 'c')
ax.plot([2], [0], [0],'go')
# bottom figure
ax2 = fig.add_subplot(2,1,2, projection='3d')
x,y,z = cylinder(np.linspace(0,1,num=10), 40)
for i in range(len(z)):
ax2.plot(x[i], y[i], z[i], 'r')
ax2.plot([1], [0], [1],'go')
plt.show()
3条答案
按热度按时间beq87vna1#
今晚我正试图解决一个非常相似的问题!有些代码可能是不必要的,但它会给予你主要的想法。我希望
灵感来自:http://hackmap.blogspot.com.au/2008/06/pylab-matplotlib-imagemap.html和其他许多不同的来源在过去的两个小时。..
juud5qan2#
我的最后一个代码,只是有一个可行的例子:
ffdz8vbo3#
固定线的轻微移动
连接一个点,
fig.canvas.draw()
和fig.savefig('…')
可以工作。在我的环境(pydroid)中
用
plt.show()
显示图形时,点和线边缘的坐标不匹配,可能是因为pydroid中的intractive后端自动改变图形大小,然后移动线。所以我使用了fig.savefig('…')
而不是plt.show()
。插入
fig.canvas.draw()
(在
ax.set_xlim(…,…)
等之后)proj3d.proj_transform
之前)也可以工作。fig
代码在下面。