Как построить планки ошибок в полярных координатах в python?

У меня есть следующая проблема: я хочу построить некоторые точки данных в полярных координатах в 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()

но я хочу добавить планки ошибок и не нахожу достаточного решения. Есть ли уже готовый код matplotlib? Или кто-нибудь знает, как правильно определить бары ошибок? Насколько я понимаю, r-ошибка — это просто прямая линия, а тета-ошибка должна быть отрезком окружности.


person Madao    schedule 27.10.2014    source источник


Ответы (2)


Ограничение погрешности заключается в том, что колпачки рисуются с коллекциями hline и vline, поэтому колпачки неправильно вращаются в полярных координатах (для этого существует проблема, https://github.com/matplotlib/matplotlib/issues/441). Приблизительный обходной путь — просто сделать заглавные буквы нулевого размера:

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

полярный график с планками погрешностей

Если вы хотите, чтобы полосы тета-ошибок были круглыми, вам придется реализовать это самостоятельно. Самый простой способ

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

Для небольших ошибок это не будет иметь большого значения, но будет иметь значение для больших ошибок.

person tacaswell    schedule 27.10.2014
comment
Спасибо, это было именно то, что я искал! - person Madao; 28.10.2014

Я бы рекомендовал что-то вроде этого:

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

Но, кажется, есть какая-то проблема. Я не знаю, присуще ли это pylab. Что-то в растерянности, что делать :)

person ssm    schedule 27.10.2014