2016-04-28 5 views
2

Я пытаюсь построить данные по часовой стрелке с использованием matplotlib в Python в стиле this answer. Я заметил странное поведение при построении моих данных; точки данных имели правильное значение y, но не отображались с правильными значениями x, то есть раз. Сначала я подумал, что мои данные ошибочны, но после воссоздания моей проблемы со следующим рабочим примером я пришел к выводу, что ошибка должна быть где-то в другом месте.Python полярный часовой график с matplotlib

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. В настоящее время он определяется как угол, но я также попытался определить его как час. Почему это не так, и как я могу получить мои данные в соответствии с соответствующим временем?

ответ

3

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 = np.linspace(0, 2*np.pi, 24, endpoint=False)

+0

Спасибо, это решило мою проблему! Для тех, кто заинтересован, чтобы преобразовать время от 24-часового до лучистого, просто умножьте время на 15, чтобы получить степень, а затем преобразовать его в радианы (хотя, безусловно, есть более прямолинейное решение). 'lambda t: np.deg2rad (t * 15)' – Alarik

1

Ваш equals массив находится в градусах, но matplotlib ожидает радианы. Поэтому все, что вам нужно сделать, это сделать ваши измерения угла в радианах.

Смежные вопросы