与matplotlib的Python极地时钟状图

时间:2016-04-28 15:33:56

标签: python matplotlib plot polar-coordinates

我正在尝试使用Python中的matplotlib以this answer的方式以时钟方式绘制数据。我在绘制数据时注意到了奇怪的行为;数据点具有正确的y值,但不会出现在正确的x值,即时间。我首先想到的是我的数据是错误的,但是在用以下工作示例重新创建我的问题后,我得出的结论是错误必须在其他地方。

import numpy as np
import matplotlib.pyplot as plt     

ax = plt.subplot(111, polar=True)
equals = np.linspace(0, 360, 24, endpoint=False) #np.arange(24)
ones = np.ones(24)
ax.scatter(equals, ones)       

# Set the circumference labels
ax.set_xticks(np.linspace(0, 2*np.pi, 24, endpoint=False))
ax.set_xticklabels(range(24))      

# Make the labels go clockwise
ax.set_theta_direction(-1)       

# Place 0 at the top
ax.set_theta_offset(np.pi/2.0)       

plt.show()

这导致以下情节: enter image description here

考虑到equals的定义,我原本预计这些点的x值与小时数一致。它目前被定义为一个角度,但我也尝试将其定义为一个小时。为什么不是这种情况,如何让我的数据与相应的时间对齐?

2 个答案:

答案 0 :(得分:4)

Matplotlib期望角度以弧度为单位而不是度数(参见open bug report)。您可以使用numpy函数np.deg2rad转换为弧度:

import numpy as np
import matplotlib.pyplot as plt     

ax = plt.subplot(111, polar=True)
equals = np.linspace(0, 360, 24, endpoint=False) #np.arange(24)
ones = np.ones(24)
ax.scatter(np.deg2rad(equals), ones)       

# Set the circumference labels
ax.set_xticks(np.linspace(0, 2*np.pi, 24, endpoint=False))
ax.set_xticklabels(range(24))      

# Make the labels go clockwise
ax.set_theta_direction(-1)       

# Place 0 at the top
ax.set_theta_offset(np.pi/2.0)       

plt.show()

这会产生以下图片:

enter image description here

或者,你可以改变你的equals定义,用弧度表示角度:equals = np.linspace(0, 2*np.pi, 24, endpoint=False)

答案 1 :(得分:1)

你的equals数组是度,但matplotlib需要弧度。所以你需要做的就是用弧度进行角度测量。