Matplotlib中的极坐标方程图不完整。

3

我目前正在尝试使用matplotlib在极坐标系中绘制方程r = 4 * sin(2 * theta),基于链接的example。以下是我的代码:

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))

这将导致以下输出:

incorrect

然而,根据沃尔夫勒姆阿尔法的显示,正确的图表如下所示:

correct

我的代码似乎缺少了一大部分图形,它只有两个花瓣,而不是四个。我确保将两个方程都绘制为theta从0到2pi,所以它们应该显示相同的内容。
有人知道我错在哪里吗?我不确定我是否误解了如何使用matplotlib,或者我是否遗漏了一些明显的错误。

我曾经遇到过这个问题,每当我尝试绘制一个玫瑰曲线时,如果n值是偶数,它只会绘制部分真实的图形。当我检查这些图形时,我开始认为可能是因为matplotlib的极坐标图不能正确地绘制负r值(正如mtpain所提到的)。他简洁的解决方法对我很有用,但令人恼火的是,即使在最新版本的matplotlib中,这仍然是一个问题。 - liamnickell
3个回答

2

看起来matplotlib出现了问题,因为你给它传递了一个负数作为半径。

我尝试了你的代码并得到了相同的结果。我修改了你的代码行:

r = map(f, theta)

成为

r = map(abs(f), theta)

并得到了这个图表:

径向图

如果你问我的话,来自Wolfram的“极坐标图”有点误导人。它肯定不像matplotlib版本那样结构化。


1

我运行了完全相同的代码,结果如下。或许需要检查一下你的numpy和matplotlib版本。

>>> import numpy as np
>>> np.version.version
'1.7.1'
>>> import matplotlib
>>> matplotlib.__version__
'1.1.1'

enter image description here


看起来我实际上比较领先一些——我有numpy 1.8.0和matplotlib 1.3.1。我会尝试检查是否有任何可用的升级。 - Michael0x2a
@Michael0x2a 在这里看到了同样的情况。可能是一个回归 bug? - user2051561
请查看以下链接:
  • https://github.com/matplotlib/matplotlib/issues/2133
  • https://github.com/matplotlib/matplotlib/issues/2203
  • http://matplotlib.org/devel/MEP/MEP24.html
- user2051561

-1

我认为极坐标函数的追踪也存在问题。它应该在(x pos,y pos)象限中追踪线条,然后是(xpos,yneg),到(xneg,yneg),最后是(xneg,ypos)象限。

这就是这些图形背后的概念,这导致了对空间物体运动的理解。如果你将函数调整为r = sin(4 * theta),你会得到像Wolfram绘图一样的图形。

从概念上讲,在极坐标图上绘制极坐标图似乎存在问题,并以笛卡尔坐标结束。我怀疑f上的abs调用解决了问题,但掩盖了您正在绘制反转的r值,使其成为不连续函数,而实际上它并不是。

就天体运动关系而言,这似乎类似于反转重力!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接