2015-10-14 2 views
5

Как часть попытки научиться использовать Bokeh, я пытаюсь сделать простую гистограмму. Я пропускаю ярлыки в определенном порядке (дни недели), и Боке, кажется, сортирует их по алфавиту. Как я могу отображать бары в порядке первоначального списка?Выбор порядка баров в гистограмме Bokeh

from bokeh.plotting import show 
from bokeh.io import output_notebook 
from bokeh.charts import Bar 
from collections import OrderedDict 
import calendar 

output_notebook() 

data = OrderedDict() 
data['values'] = [2,3,4,5,6,7,8] #values only ascending to make correct graph clear 
data['days'] = [calendar.day_name[i-1] for i in range(7)] 
p = Bar(data, label='days', values='values', 
     title='OrderedDict Input',xlabel="Day", ylabel="Value") 
show(p) 

Output generated

ответ

2

Я не большой любитель карт высокого уровня, таких как бар, участки. Они не очень настраиваемые. Построение их «вручную» часто бывает проще - и не нужно намного дольше. Это то, что я хотел бы сделать, с прямоугольниками:

from bokeh.plotting import show,figure 
from bokeh.io import output_notebook 
from bokeh.models import Range1d 
import calendar 

output_notebook() 

order = range(1,8) 
values=[2,3,4,5,6,7,8] 
days = [calendar.day_name[i-1] for i in order] 
yr = Range1d(0,max(values)) 
p = figure(x_range=days, y_range=yr) 
p.rect(order, [val/2.0 for val in values] , width=0.5, height=values, color = "#ff1200") 

show(p) 

Надеется, что это помогает, т.

Edit:

Это теперь еще проще с vbar:

from bokeh.plotting import figure 
from bokeh.io import output_file, show 
import calendar 

values = [2,3,4,5,6,7,8] 
days = [calendar.day_name[i-1] for i in range(1,8)] 

p = figure(x_range=days) 
p.vbar(x=days, width=0.5, top=values, color = "#ff1200") 

output_file('foo.html') 
show(p) 

, который дает:

enter image description here

+0

Это теперь даже просто с 'vbar' (также' bokeh.charts' устарели и удалены) Много бар примеры приведены на странице: https://bokeh.pydata.org/en/latest/docs/user_guide/categorical.html – bigreddot

8

Вот как сохранить первоначальный порядок ярлыков в вашем примере с помощью интерфейс Charts, протестированный с помощью Bokeh 0.11.1.

from bokeh.plotting import show 
from bokeh.io import output_notebook 
from bokeh.charts import Bar 
from collections import OrderedDict 
import calendar 
from bokeh.charts.attributes import CatAttr 

output_notebook() 

data = OrderedDict() 
data['values'] = [2,3,4,5,6,7,8] #values only ascending to make correct graph clear 
data['days'] = [calendar.day_name[i-1] for i in range(7)] 
p = Bar(data, label=CatAttr(columns=['days'], sort=False), 
     values='values',title='OrderedDict Input',xlabel="Day", ylabel="Value") 
show(p) 
2

В общем, с любым сюжетом вы можете указать ядро ​​x (или y) явно. tk's answer полезно, если вы хотите полностью игнорировать класс диаграммы Bar (что, по указанным причинам, не самая худшая идея в мире). user666's answer полезно, если ваши столбцы данных уже заказаны так, как вы хотите. В противном случае вы можете указать порядок себя:

Неделя начинается в воскресенье:

from bokeh.models import FactorRange 
... 
p.x_range = FactorRange(factors=data['days']) 

Sunday start

Неделя начинается в понедельник:

p.x_range = FactorRange(factors=data['days'][1:] + [data['days'][0]]) 

enter image description here

0

Это комментарий связан с ответом от user666 (я не имею достаточно кредитов, чтобы добавить комментарии.)

Я не думаю, что использование OrderedDict помогает здесь, так как она помнит только порядок, что были вставлены ключи (т.е. «значения» предшествуют «дням»), а не порядку последовательностей, которые являются значениями, связанными с этими ключами.

Также FYI есть обсуждение этого вопроса на боке GitHub сайте здесь: https://github.com/bokeh/bokeh/issues/2924 и здесь: https://github.com/bokeh/bokeh/pull/3623

+1

Просто поймите, что OrderedDict был в OP. Сожалею. – JHD