Столбики ошибок полярного графика не вращаются с углом в matplotlib - PullRequest
2 голосов
/ 29 августа 2011

Я хочу создать диаграмму с полярными столбцами с ошибками в matplotlib.Когда я использую следующий код, все мои строки ошибок имеют горизонтальное выравнивание, и это выглядит неправильно, если только полоса не соответствует случаю 90 или 270 градусов.

from numpy import *
from matplotlib import pyplot as py


r=zeros([16])
err=zeros([16]) 
for i in range(16):
    r[i]=random.randint(400,600)
    err[i]=random.randint(20,50)
theta=arange(0,2*pi,2*pi/16)
width = pi*2/16

fig = py.figure(figsize=(8,8))
ax = fig.add_axes([0.1, 0.1, 0.75, 0.79], polar=True)

bars = ax.bar(theta+pi/16, r, width=width, bottom=0.0,yerr=err)
ax.set_ylim(0,700)
py.show()

the figure

Как получить бары ошибок, чтобы принять во внимание тета отдельного бара?

1 Ответ

2 голосов
/ 29 августа 2011

Итак, похоже, что панели ошибок создаются с помощью объекта Line2D;то есть пунктирная линия строится с точками данных, соответствующими позициям полосы ошибок (x [i], y [i] + yerr [i]).Черточки в строке всегда одинаковы, потому что они просто символы.Это явно не работает для полярного сюжета.Таким образом, эту настройку панели ошибок необходимо удалить, и каждую строку ошибок необходимо добавлять отдельно, с линией, имеющей правильную ориентацию.

Вот процедура, которая делает это:

from matplotlib.lines import Line2D
from math import acos,sqrt

def correct_errorbar(ax,barlen=50,errorline=1):
    """
    A routine to remove default y-error bars on a bar-based pie chart and 
    replace them  with custom error bars that rotate with the pie chart.
    ax -- the axes object that contains the polar coordinate bar chart
    barlen -- the perpendicular length of each error bar
    errorline -- the number of the Line2D object that represents the original
       horizontal error bars.

    barlen will depend on the magnitude of the "y" values, ie the radius. 
    This routine was tested with a plot consisting solely of bar chart, and 
    if other Line2D objects are added, either directly or through further
    plot commands, errorline many need to be adjusted from its default value. 
    """
    # get error bar positions
    x,y = ax.lines[errorline].get_data()
    # remove incorrect bars
    del ax.lines[errorline]
    # add new lines fixing bars
    for i in range(len(y)):
        r = sqrt(barlen*barlen/4+y[i]*y[i])
        dt = acos((y[i])/(r))
        newline = Line2D([x[i]-dt,x[i]+dt],[r,r],lw=barlen/100.)
        ax.add_line(newline)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...