Цвет головы усов боке

Я хотел бы построить планки погрешностей (std) для моего точечно-линейного графика. Я не нашел правильного ответа, как это сделать, но одно из решений - использовать усы. https://docs.bokeh.org/en/latest/docs/user_guide/annotations.html#whiskers

Я работал у меня довольно хорошо, но у меня есть проблема, как изменить цвет головы усов.

Я использовал свойство цвет линии, чтобы изменить цвет линии: https://docs.bokeh.org/en/latest/docs/reference/models/annotations.html#bokeh.models.annotations.Whisker

но не изменил цвет головы (горизонтальная линия). Остается черный. Есть способ как это сделать? или есть лучший способ построить полосы погрешностей цветом линии?

Пример кода из боке с красными линиями и черными головками для полос ошибок:

from bokeh.models import ColumnDataSource, Whisker
from bokeh.plotting import figure, show
from bokeh.sampledata.autompg import autompg as df

colors = ["red", "olive", "darkred", "goldenrod", "skyblue", "orange", "salmon"]

p = figure(plot_width=600, plot_height=300, title="Years vs mpg with Quartile Ranges")

base, lower, upper = [], [], []

for i, year in enumerate(list(df.yr.unique())):
    year_mpgs = df[df['yr'] == year]['mpg']
    mpgs_mean = year_mpgs.mean()
    mpgs_std = year_mpgs.std()
    lower.append(mpgs_mean - mpgs_std)
    upper.append(mpgs_mean + mpgs_std)
    base.append(year)

source_error = ColumnDataSource(data=dict(base=base, lower=lower, upper=upper))

p.add_layout(
    Whisker(source=source_error, base="base", upper="upper", lower="lower", line_color='red')
)

for i, year in enumerate(list(df.yr.unique())):
    y = df[df['yr'] == year]['mpg']
    color = colors[i % len(colors)]
    p.circle(x=year, y=y, color=color)

show(p)

person Admed    schedule 23.01.2018    source источник


Ответы (1)


Концы усов настраиваются с помощью свойств upper_head и lower_head, которые представляют собой ArrowHead объекты, имеющие свои собственные line_color и т. Д. Самый простой способ их настройки, вероятно, выглядит следующим образом:

w = Whisker(source=source_error, base="base", upper="upper", lower="lower", 
            line_color='red')
w.upper_head.line_color = 'red'
w.lower_head.line_color = 'red'
p.add_layout(w)

Хотя также можно передать явно сконфигурированный TeeHead Whisker, если вы действительно хотите сделать все в одном выражении:

Whisker(..., 
        upper_head=TeeHead(line_color='red'), 
        lower_head=TeeHead(line_color='red'))
person bigreddot    schedule 23.01.2018
comment
Спасибо за решение - person Admed; 25.01.2018
comment
Второе решение требует from bokeh.models.arrow_heads import TeeHead и (по крайней мере, для моего примера) сбрасывает line_width до значения по умолчанию, которое примерно в два раза больше. Первый работает как шарм. - person maow; 30.03.2018
comment
Да, это было просто для иллюстрации техники, вам все равно нужно будет полностью настроить ее под свои нужды. - person bigreddot; 01.04.2018