2014-10-27 10 views
5

Ho il seguente problema: Voglio tracciare alcuni punti di dati in coordinate polari in pitone, che è facile, utilizzando un codice comeCome tracciare le barre di errore in coordinate polari in python?

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() 

ma voglio aggiungere barre di errore e non trovo alcuna soluzione sufficiente Esiste già un prefisso matplotlib-code? O qualcuno sa come definire correttamente le barre di errore? A quanto ho capito, l'errore r è solo una linea retta, mentre l'errore theta dovrebbe essere un segmento di un cerchio.

risposta

2

Sulla limitazione errorbar è che i tappi sono disegnati con hline e vline collezioni così i tappi a non ruotare correttamente in coordinate polari (c'è un problema aperto per questo, https://github.com/matplotlib/matplotlib/issues/441). Una soluzione approssimativa è di fare solo i tappi sono pari a zero dimensioni:

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

Se si desidera che le barre di errore theta ad essere circolare si dovrà attuare tale la vostra auto. Il modo più semplice è

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() 

Per piccoli errori questo non sarà davvero fare la differenza, ma sarà materia per i grandi errori.

+0

Grazie, era esattamente quello che stavo cercando! – Madao

0

avrei consigliato qualcosa di simile:

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() 

Ma ci seeems essere qualche problema. Non so se è inerente a pylab. Tipo di in perdita su cosa fare :)