Matplotlib - 在极坐标图中绘制平滑的圆形

13

我非常喜欢Matplotlib的极坐标图,希望继续使用它(因为我的数据点已经以极坐标给出,而我的环境是环形的)。

但是,在图表中,我想在特定点上添加给定半径的圆圈。

通常,我会这样做:

 ax = plt.subplot(111)
 ax.scatter(data)
 circle = plt.Circle((0,0), 0.5)
 ax.add_artist(circle)
 plt.show()

然而,在极坐标下,我不能使用圆形,因为它假定为矩形坐标系。

我想到的方法是:生成具有恒定径向坐标和[0,2PI]范围内角度坐标的点阵数组,或完全切换到矩形坐标系。这两种解决方案都不是很令人满意 - 有没有更好的Matplotlib解决方案?

谢谢!

1个回答

23
您可以设置Circletransform参数:
%matplotlib inline
import pylab as pl
import numpy as np

N = 100
theta = np.random.rand(N)*np.pi*2
r = np.cos(theta*2) + np.random.randn(N)*0.1

ax = pl.subplot(111, polar=True)
ax.scatter(theta, r)
circle = pl.Circle((0.5, 0.3), 0.2, transform=ax.transData._b, color="red", alpha=0.4)
ax.add_artist(circle)

输出:

或者,如果您不喜欢使用私有属性,则使用transform=ax.transProjectionAffine + ax.transAxes


太好了,谢谢!只有一个注释关于你的解决方案(以防万一有人偶然发现):圆的原点必须用笛卡尔坐标给出。 - limbonic
1
如果圆的中心以度数给出,该怎么办? - haccks
1
如果您已经通过 ax.set_theta_zero_location('N') 更改了 theta 的零点位置,那么您应该使用 transform = (Affine2D().rotate(ax._theta_offset.get_matrix()[0, 2]) + ax.transProjectionAffine + ax.transAxes) - codeMonkey

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