我尝试以三个轴的弹簧形式绘制对数螺线。 使用参数方程:
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()
我明白了:
但是,我想沿Z axis
拉伸螺旋以获得类似于以下的结果,但使用对数螺线作为基础:
你怎么能这样做?如何通过向Z axis
添加条件来修改函数?
答案 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()
您可以使用a
和b
参数来获得所需的椭圆形状。您还可以使用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()
请注意,我在这里清理了导入内容。例如。如果您从cos
导入math
但稍后将所有内容(*
)从pylab导入命名空间,则使用的函数cos
是numpy cos
函数,而不是数学中的那个(数学cos函数无论如何都不会在这里工作)。一般来说:根本不使用pylab。