【问题标题】:Drawing a logarithmic spiral in three axes in Python在 Python 中绘制三个轴上的对数螺旋
【发布时间】:2018-02-01 13:07:11
【问题描述】:

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

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加个条件?

【问题讨论】:

  • 这是一道数学函数,不是一道编程题。 z 坐标是距中心的距离的函数。 1e42 的值也很大。
  • 你没有给情节提供任何z 坐标...
  • 嗯,是的,我可以添加任何z 变量,但我不知道x and y 变量之间的关系应该是什么。
  • 线性超过th?

标签: python math matplotlib spiral


【解决方案1】:

选择哪个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 的定义来使其呈指数增长,或以对数增长.. 或完全其他的东西。

顺便说一句,您的导入有点多余,并且可能来自一个包的某些功能被另一个包所掩盖。

【讨论】:

    【解决方案2】:

    由于 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()
    

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

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 2013-03-08
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 2021-03-03
      • 1970-01-01
      相关资源
      最近更新 更多