Легенда положения боке за пределами участка для сложенного vbar - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть сложенная диаграмма vbar в Bokeh, упрощенная версия которой может быть воспроизведена с помощью:

from bokeh.plotting import figure
from bokeh.io import show

months = ['JAN', 'FEB', 'MAR']
categories = ["cat1", "cat2", "cat3"]
data = {"month" : months,
        "cat1"  : [1, 4, 12],
        "cat2"  : [2, 5, 3],
        "cat3"  : [5, 6, 1]}
colors = ["#c9d9d3", "#718dbf", "#e84d60"]

p = figure(x_range=months, plot_height=250, title="Categories by month",
           toolbar_location=None)
p.vbar_stack(categories, x='month', width=0.9, color=colors, source=data)

show(p)

Я хочу добавить легенду к диаграмме, но моя настоящая диаграмма имеет много категорий в стопках, и поэтому легенда будет очень большой, поэтому я хочу, чтобы она находилась вне области графика справа.

Здесь есть SO-ответ здесь , который объясняет, как добавить легенду вне области графика, но в приведенном примере каждому отображаемому глифу присваивается переменная, которая затем помечается и добавляется к Legend объект. Я понимаю, как это сделать, но я полагаю, что метод vbar_stack создает многократные глифы за один вызов, поэтому я не знаю, как их пометить и добавить в отдельный объект Legend для размещения вне области диаграммы?

В качестве альтернативы, есть ли более простой способ использовать аргумент legend при вызове vbar_stack и затем найти легенду за пределами области диаграммы?

Любая помощь высоко ценится.

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Спасибо Тоби Петти за ваш ответ.

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

from bokeh.plotting import figure
from bokeh.io import show
from bokeh.models import Legend
from bokeh.palettes import brewer

months = ['JAN', 'FEB', 'MAR']
data = {"month" : months,
        "cat1"  : [1, 4, 12],
        "cat2"  : [2, 5, 3],
        "cat3"  : [5, 6, 1],
        "cat4"  : [8, 2, 1],
        "cat5"  : [1, 1, 3]}
categories = list(data.keys())
categories.remove('month')
colors = brewer['YlGnBu'][len(categories)]

p = figure(x_range=months, plot_height=250, title="Categories by month",
           toolbar_location=None)
v = p.vbar_stack(categories, x='month', width=0.9, color=colors, source=data)

legend = Legend(items=[(x, [v[i]]) for i, x in enumerate(categories)], location=(0, -30))

p.add_layout(legend, 'right')

show(p)
0 голосов
/ 08 ноября 2018

Для тех, кто заинтересован, теперь исправьте это, используя простое индексирование глифов vbar_stack. Решение ниже:

from bokeh.plotting import figure
from bokeh.io import show
from bokeh.models import Legend

months = ['JAN', 'FEB', 'MAR']
categories = ["cat1", "cat2", "cat3"]
data = {"month" : months,
        "cat1"  : [1, 4, 12],
        "cat2"  : [2, 5, 3],
        "cat3"  : [5, 6, 1]}
colors = ["#c9d9d3", "#718dbf", "#e84d60"]

p = figure(x_range=months, plot_height=250, title="Categories by month",
           toolbar_location=None)
v = p.vbar_stack(categories, x='month', width=0.9, color=colors, source=data)

legend = Legend(items=[
    ("cat1",   [v[0]]),
    ("cat2",   [v[1]]),
    ("cat3",   [v[2]]),
], location=(0, -30))

p.add_layout(legend, 'right')

show(p)
...