首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中3d绘图中的线条

python中3d绘图中的线条
EN

Stack Overflow用户
提问于 2020-08-21 19:18:26
回答 2查看 1.3K关注 0票数 0

我有以下脚本:

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d

nn = 400  # number of points along circle's perimeter
theta = np.linspace(0, 2*np.pi, nn)
rho = np.ones(nn)

# (x,y) represents points on circle's perimeter
x = np.ravel(rho*np.cos(theta))
y = np.ravel(rho*np.sin(theta))

fig, ax = plt.subplots()
plt.rcParams["figure.figsize"] = [6, 10]
ax = plt.axes(projection='3d')  # set the axes for 3D plot

ax.azim = -90   # y rotation (default=270)
ax.elev = 21    # x rotation (default=0)

# low, high values of z for plotting 2 circles at different elev.
loz, hiz = -15, 15

# Plot two circles
ax.plot(x, y, hiz)   
ax.plot(x, y, loz)  

# set some indices to get proper (x,y) for line plotting
lo1,hi1 = 15, 15+nn//2
lo2,hi2 = lo1+nn//2-27, hi1-nn//2-27

# plot 3d lines using coordinates of selected points
ax.plot([x[lo1], x[hi1]], [y[lo1], y[hi1]], [loz, hiz]) 
ax.plot([x[lo2], x[hi2]], [y[lo2], y[hi2]], [loz, hiz]) 

ax.plot([0, 0, 0], [0, 0, 10])
ax.plot([0, 0, 0], [9, 0, 0])
ax.plot([0, 0, 0], [0, 8, 0])

plt.show()

在脚本的末尾,我想在三个方向上绘制三行。如何做到这一点?为什么会这样:

代码语言:javascript
复制
ax.plot([0, 0, 0], [0, 0, 10])
ax.plot([0, 0, 0], [9, 0, 0])
ax.plot([0, 0, 0], [0, 8, 0])

使这条线在同一方向上?

我还有第二个问题。如何使圆锥体更窄(底部更类似于圆)?

现在输出:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-21 21:25:22

ax.plot([0, 0, 0], [0, 0, 10])plot提供了3个点的x和y坐标,但是您没有给出z方向的任何坐标。记住,plot的输入是x,y,z,而不是您可能假设的那样,(x0,y0,z0),(x1,y1,z1)

这里画了3条“线”,其中两条以x=y=z=0为起点和终点,另一条延伸到y=10,另外两条ax.plot调用也做了类似的事情。

要绘制三条从原点开始并沿x、y或z方向之一延伸的直线,您可能需要使用:

代码语言:javascript
复制
ax.plot([0, 0], [0, 0], [0, 10])  # extend in z direction
ax.plot([0, 0], [0, 8], [0, 0])   # extend in y direction
ax.plot([0, 9], [0, 0], [0, 0])   # extend in x direction

注意,这也会让你的圆圈看起来更像圆圈

票数 1
EN

Stack Overflow用户

发布于 2020-08-21 19:44:28

在注释了代码的最后3行之后,图像就是我得到的输出

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d

nn = 400  # number of points along circle's perimeter
theta = np.linspace(0, 2*np.pi, nn)
rho = np.ones(nn)

# (x,y) represents points on circle's perimeter
x = np.ravel(rho*np.cos(theta))
y = np.ravel(rho*np.sin(theta))

fig, ax = plt.subplots()
plt.rcParams["figure.figsize"] = [6, 10]
ax = plt.axes(projection='3d')  # set the axes for 3D plot

ax.azim = -90   # y rotation (default=270)
ax.elev = 21    # x rotation (default=0)

# low, high values of z for plotting 2 circles at different elev.
loz, hiz = -15, 15

# Plot two circles
ax.plot(x, y, hiz)   
ax.plot(x, y, loz)  

# set some indices to get proper (x,y) for line plotting
lo1,hi1 = 15, 15+nn//2
lo2,hi2 = lo1+nn//2-27, hi1-nn//2-27

# plot 3d lines using coordinates of selected points
ax.plot([x[lo1], x[hi1]], [y[lo1], y[hi1]], [loz, hiz]) 
ax.plot([x[lo2], x[hi2]], [y[lo2], y[hi2]], [loz, hiz]) 

#ax.plot([0, 0, 0], [0, 0, 10])
#ax.plot([0, 0, 0], [9, 0, 0])
#ax.plot([0, 0, 0], [0, 8, 0])

plt.show()

你可以看到底座几乎是一个完美的圆圈。因为您还在图形中绘制线条,所以它给人一种底线不是圆的错觉。

关于3个不同方向的线。由于这部分代码

代码语言:javascript
复制
ax.plot([0, 0, 0], [0, 0, 10])
ax.plot([0, 0, 0], [9, 0, 0])
ax.plot([0, 0, 0], [0, 8, 0])

在X轴上全为零,则本质上是仅在Y轴上绘制直线。

当我在X轴部分中给出一些值时,如下所示

代码语言:javascript
复制
ax.plot([1, 0, 0], [0, 0, 10])
ax.plot([0, 0, 5], [9, 0, 0])
ax.plot([0, 8, 0], [0, 8, 0])

输出为

我希望这就是你要问的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63521889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档