Matplotlib 中的极坐标图通过映射到笛卡尔坐标
Polar plot in Matplotlib by mapping into Cartesian coordinate
我有一个变量 (P),它是角度 (theta) 的函数:
在这个等式中,K 是常数,theta_p 等于零,I 是第一类修正贝塞尔函数(0阶)定义为:
现在,我想绘制 P 与 theta 的不同常数值 K.首先,我计算了参数 I,然后将其代入第一个方程以计算不同角度 theta 的 P。我通过放置将其映射到笛卡尔坐标:
x = P*cos(θ)
y = P*sin(θ)
这是我的 python 实现,使用 matplotlib 和 scipy 当常量 k=2.0:
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import quad
def integrand(x, a, k):
return a*np.exp(k*np.cos(x))
theta = (np.arange(0, 362, 2))
theta_p = 0.0
X = []
Y = []
for i in range(len(theta)):
a = (1 / np.pi)
k = 2.0
Bessel = quad(integrand, 0, np.pi, args=(a, k))
I = list(Bessel)[0]
P = (1 / (np.pi * I)) * np.exp(k * np.cos(2 * (theta[i]*np.pi/180. - theta_p)))
x = P*np.cos(theta[i]*np.pi/180.)
y = P*np.sin(theta[i]*np.pi/180.)
X.append(x)
Y.append(y)
plt.plot(X,Y, linestyle='-', linewidth=3, color='red')
axes = plt.gca()
plt.show()
对于不同的 K 值,我应该得到一组如下图所示的图表:
(请注意,分布绘制在单位 1 的圆上以便于可视化)
不过上面代码生成的图好像和上图不太一样。
知道上面的实现有什么问题吗?
在此先感谢您的帮助。
这是它的样子(对于 k=2):
这些公式的参考是您可以找到的等式 5 和 6 here
你的公式有误。
您的公式给出单位圆上方的函数 delta。所以在你的函数中得到你想要的情节,简单地加 1 就可以了。
这是您想要的,其中一些已整理 python。 ...请注意,您可以将 'P' 值的整个计算作为一个 numpy 向量线,您不需要遍历指标。 ...您也可以直接在 matplotlib 中绘制极坐标图 - 您不需要将其转换为笛卡尔坐标。
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import quad
theta = np.arange(0, 2*np.pi+0.1, 2*np.pi/100)
def integrand(x, a, k):
return a*np.exp(k*np.cos(x))
for k in np.arange(0, 5, 0.5):
a = (1 / np.pi)
Bessel = quad(integrand, 0, np.pi, args=(a, k))
I = Bessel[0]
P = 1 + (1/(np.pi * I)) * np.exp(k * np.cos(2 * theta))
plt.polar(theta, P)
plt.show()
我有一个变量 (P),它是角度 (theta) 的函数:
在这个等式中,K 是常数,theta_p 等于零,I 是第一类修正贝塞尔函数(0阶)定义为:
现在,我想绘制 P 与 theta 的不同常数值 K.首先,我计算了参数 I,然后将其代入第一个方程以计算不同角度 theta 的 P。我通过放置将其映射到笛卡尔坐标:
x = P*cos(θ)
y = P*sin(θ)
这是我的 python 实现,使用 matplotlib 和 scipy 当常量 k=2.0:
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import quad
def integrand(x, a, k):
return a*np.exp(k*np.cos(x))
theta = (np.arange(0, 362, 2))
theta_p = 0.0
X = []
Y = []
for i in range(len(theta)):
a = (1 / np.pi)
k = 2.0
Bessel = quad(integrand, 0, np.pi, args=(a, k))
I = list(Bessel)[0]
P = (1 / (np.pi * I)) * np.exp(k * np.cos(2 * (theta[i]*np.pi/180. - theta_p)))
x = P*np.cos(theta[i]*np.pi/180.)
y = P*np.sin(theta[i]*np.pi/180.)
X.append(x)
Y.append(y)
plt.plot(X,Y, linestyle='-', linewidth=3, color='red')
axes = plt.gca()
plt.show()
对于不同的 K 值,我应该得到一组如下图所示的图表:
(请注意,分布绘制在单位 1 的圆上以便于可视化)
不过上面代码生成的图好像和上图不太一样。 知道上面的实现有什么问题吗? 在此先感谢您的帮助。
这是它的样子(对于 k=2):
这些公式的参考是您可以找到的等式 5 和 6 here
你的公式有误。
您的公式给出单位圆上方的函数 delta。所以在你的函数中得到你想要的情节,简单地加 1 就可以了。
这是您想要的,其中一些已整理 python。 ...请注意,您可以将 'P' 值的整个计算作为一个 numpy 向量线,您不需要遍历指标。 ...您也可以直接在 matplotlib 中绘制极坐标图 - 您不需要将其转换为笛卡尔坐标。
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import quad
theta = np.arange(0, 2*np.pi+0.1, 2*np.pi/100)
def integrand(x, a, k):
return a*np.exp(k*np.cos(x))
for k in np.arange(0, 5, 0.5):
a = (1 / np.pi)
Bessel = quad(integrand, 0, np.pi, args=(a, k))
I = Bessel[0]
P = 1 + (1/(np.pi * I)) * np.exp(k * np.cos(2 * theta))
plt.polar(theta, P)
plt.show()