使用matplotlib绘制具有负半径的函数的极坐标图

6
下面的Python代码应该在范围[-pi/2, pi/2]上绘制r(theta) = theta。
import matplotlib.pyplot as plt
import numpy

theta = numpy.linspace(-numpy.pi / 2, numpy.pi / 2, 64 + 1)
r = theta

plt.polar(theta, r)
plt.savefig('polar.png')

这会生成绘图:

polar plot

然而,我希望它生成:

expected polar plot

r(theta)的负值似乎被裁剪了。如何使matplotlib绘制r(theta)的负值?

1
看起来这个问题从未关闭。https://github.com/matplotlib/matplotlib/issues/2203 - Alexander Kleinhans
@Alexander Kleinhans,这个问题是关于另一个问题的。它讨论的问题是不能为负半径值设置网格,而不是不能绘制负半径值。 - Vaelus
我不确定这个链接的问题是否真的相关,但如果是的话,我想现在应该已经解决了。 - ImportanceOfBeingErnest
1个回答

7

第一个图看起来是正确的,只是没有显示负值。可以通过明确设置r轴的限制来解决这个问题。

import matplotlib.pyplot as plt
import numpy

theta = numpy.linspace(-numpy.pi / 2, numpy.pi / 2, 64 + 1)
r = theta

plt.polar(theta, r)
plt.ylim(theta.min(),theta.max())
plt.yticks([-1, 0,1])
plt.show()

这里输入图片描述

这种行为是基于任何数量都应该在极坐标图上可绘制的假设,这对于相对量的技术问题可能是有益的。例如,人们可能会询问周期系统中某个量的偏差与其平均值的关系。在这种情况下,matplotlib使用的约定非常适合。

从更数学(理论)的角度来看,负半径是原点的点对称。为了复制这种行为,需要将负r值的点旋转π。因此,可以通过以下代码重现问题中预期的图形

import matplotlib.pyplot as plt
import numpy as np

theta = np.linspace(-np.pi / 2, np.pi / 2, 64 + 1)
r = theta

plt.polar(theta+(r<0)*np.pi, np.abs(r))

plt.show()

enter image description here


它应该看起来像预期的图形,因为负半径在相反方向上与正半径相同。与沃尔夫拉姆阿尔法进行比较:http://www.wolframalpha.com/input/?i=plot+r+%3D+theta+from+-pi+%2F+2+to+pi+%2F+2 - Vaelus
这是一个不错的通用解决方法,但有点hackey。我意识到可能没有一个解决方法,如果有一些设置可以切换会更好。 - Vaelus

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