在Python中用三个轴绘制对数螺线

时间:2018-02-01 13:07:11

标签: python math matplotlib spiral

我尝试以三个轴的弹簧形式绘制对数螺线。 使用参数方程:

x=a*exp(b*th)*cos(th)
y=a*exp(b*th)*sin(th)

使用代码:

import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
from math import exp,sin,cos
from pylab import *

mpl.rcParams['legend.fontsize'] = 10

fig = plt.figure()
ax = fig.gca(projection='3d')
n=100
a=0.5
b=0.20
th=np.linspace(0, 500, 10000)
x=a*exp(b*th)*cos(th)
y=a*exp(b*th)*sin(th)
ax.plot(x, y)
ax.legend()

plt.show()

我明白了:

enter image description here

但是,我想沿Z axis拉伸螺旋以获得类似于以下的结果,但使用对数螺线作为基础:

enter image description here

你怎么能这样做?如何通过向Z axis添加条件来修改函数?

2 个答案:

答案 0 :(得分:4)

哪个z取决于你。从情节本身来说很难说,但我的猜测是它是线性的(最简单的选择)。

使用您的代码并添加z轴,您可以执行此类操作

import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
from math import exp,sin,cos
from pylab import *

mpl.rcParams['legend.fontsize'] = 10

fig = plt.figure()
ax = fig.gca(projection='3d')
a=0.05
b=0.10
# took the liberty of reducing the max value for th 
# as it was giving you values of the order of e42
th=np.linspace(0, 50, 10000)  
x=a*exp(b*th)*cos(th)
y=a*exp(b*th)*sin(th)
z=np.linspace(0,2, 10000)  # creating the z array with the same length as th
ax.plot(x, y, z)  # adding z as an argument for the plot
ax.legend()

plt.show()

您可以使用ab参数来获得所需的椭圆形状。您还可以使用z的定义来使其成为指数,或者在增长中使用对数......或完全不同的其他内容。

顺便说一下,你的导入有点多余,而且一个软件包中的一些功能可能被另一个软件包遮蔽了。

答案 1 :(得分:1)

由于螺旋中95%的点在图中间的一个点处会聚,因此将绘制范围限制为

是有意义的。
th=np.linspace(475, 500, 10000)

然后使用线性范围的z值将直接在绘图中为您提供所需的曲线,只需在绘图函数中指定该范围plot(x,y,z)

from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['legend.fontsize'] = 10

fig = plt.figure()
ax = fig.gca(projection='3d')

a=0.5
b=0.20
th=np.linspace(475, 500, 10000)
x=a*np.exp(b*th)*np.cos(th)
y=a*np.exp(b*th)*np.sin(th)
z = np.linspace(0,2, len(th))
ax.plot(x, y, z)
#ax.legend()

plt.show()

enter image description here

请注意,我在这里清理了导入内容。例如。如果您从cos导入math但稍后将所有内容(*)从pylab导入命名空间,则使用的函数cos是numpy cos函数,而不是数学中的那个(数学cos函数无论如何都不会在这里工作)。一般来说:根本不使用pylab。