2014-10-27 14 views
5

Mam następujący problem: Chcę wykreślić niektóre punkty danych we współrzędnych biegunowych w Pythonie, który jest łatwy, przy użyciu kodu jakJak wykreślić słupki błędów we współrzędnych biegunowych w pythonie?

import numpy as np 
import matplotlib.pyplot as plt 

r = 1e04 * np.array([5.31,5.29,5.25,5.19,5.09,4.92,4.67,4.27,3.75,3.56]) 
theta = 2*np.pi/360 * np.array(list(range(0, 100, 10))) 

plt.polar(theta, r, "ro") 

plt.show() 

ale chcę dodać słupki błędów i nie znaleźć żadnego wystarczające rozwiązanie. Czy jest już jakiś prebuild matplotlib-code? Lub czy ktoś wie, jak poprawnie zdefiniować paski błędów? Jak rozumiem, błąd r jest po prostu linią prostą, podczas gdy błąd theta powinien być odcinkiem koła.

Odpowiedz

2

W przypadku ograniczenia paska błędów jest to, że czapki są rysowane z kolekcjami hline i vline, więc czapki nie obracają się prawidłowo we współrzędnych biegunowych (problem jest otwarty, https://github.com/matplotlib/matplotlib/issues/441). Przybliżony rozwiązaniem jest po prostu zrobić czapki mają zerowy rozmiar:

import numpy as np 
import pylab as plt 

fig = plt.figure() 
ax = plt.axes(polar=True) 

r = np.array([5.31,5.29,5.25,5.19,5.09,4.92,4.67,4.27,3.75,3.56]) 
theta = 2*np.pi/360 * np.array(list(range(0, 100, 10))) 

ax.plot(theta, r, "ro") 
ax.errorbar(theta, r, yerr=1, xerr=.1, capsize=0) 

plt.show() 

polar plot with error bars

Jeśli chcesz pręty błędach theta być okrągły trzeba będzie wdrożyć że siebie. Najprostszym sposobem jest

th_err = 1 

for th, _r in zip(theta, r): 
    local_theta = np.linspace(-th_err, th_err, 15) + th 
    local_r = np.ones(15) * _r 
    ax.plot(local_theta, local_r, color='k', marker='') 

plt.show() 

Dla małych błędów nie będzie to naprawdę coś zmienić, ale będzie miało znaczenia dla dużych błędów.

+0

Dziękuję, to było dokładnie to, czego szukałem! – Madao

0

bym poleca coś takiego:

import numpy as np 
import pylab as plt 

fig = plt.figure() 
ax = plt.axes(polar=True) 

r = 1e04 * np.array([5.31,5.29,5.25,5.19,5.09,4.92,4.67,4.27,3.75,3.56]) 
theta = 2*np.pi/360 * np.array(list(range(0, 100, 10))) 

ax.plot(theta, r, "ro") 
ax.errorbar(theta, r, xerr=0.5, yerr=0.4) 

plt.show() 

Ale seeems być jakiś problem. Nie wiem, czy jest to związane z pylab. W pewnym sensie to, co należy zrobić :)