matplotlib中极方程的图形不完整
我现在正在尝试用 matplotlib 在极坐标平面上绘制方程 r = 4 * sin(2 * theta)
的图形,参考了这个链接的 示例。这是我的代码:
import numpy as np
import matplotlib.pyplot as plt
from math import sin, pi
def plot_polar(f, start=0, end=2*pi):
theta = np.linspace(start, end, 1000)
r = map(f, theta)
ax = plt.subplot(111, polar=True)
ax.plot(theta, r)
ax.grid(True)
plt.show()
plot_polar(lambda theta: 4 * sin(2 * theta))
运行后得到的结果是:
但是,根据 Wolfram Alpha 的说法,正确的图形应该是这样的:
我的代码似乎缺少了图形的一部分——它只显示了两个花瓣,而不是四个。我确保在 theta 从 0 到 2pi 的范围内绘制了两个方程,所以它们应该显示相同的内容。
有没有人知道我哪里出错了?我不确定是我对 matplotlib 的使用有误解,还是我漏掉了什么明显的错误。
3 个回答
-1
我觉得极坐标函数的轨迹也有问题。它应该先在 (x 正, y 正) 的象限画线,然后是 (x 正, y 负),接着是 (x 负, y 负),最后到 (x 负, y 正) 的象限。
这个概念就是这些图表的基础,它帮助我们理解物体在太空中的运动。如果你把函数改成 r = sin(4*theta),你就会得到像 Wolfram 图那样的图。
从概念上讲,绘制极坐标图似乎存在问题,即使是在极坐标图上,最后得到的却是笛卡尔坐标。我怀疑在 f 上使用 abs 函数可以解决这个问题,但这会让你看不出你实际上是在绘制反向的 r 值,这样就变成了一个不连续的函数,实际上它并不是。
在物体运动的关系上,这似乎就像是反转重力一样!!
1
我运行了完全一样的代码,结果是这样的。你可以检查一下你的numpy和matplotlib的版本。
>>> import numpy as np
>>> np.version.version
'1.7.1'
>>> import matplotlib
>>> matplotlib.__version__
'1.1.1'
2
看起来是因为你给 matplotlib 传了一个负数作为半径,所以它出现了问题。
我试了你的代码,结果也是一样。我把你的这一行
r = map(f, theta)
改成了
r = map(abs(f), theta)
然后得到了这个图:
我觉得 Wolfram 的“极坐标图”有点误导人。它的结构跟 matplotlib 的版本完全不一样。