Есть ли способ использовать текстовые значения X с Bokeh? - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь построить простую диаграмму с Bokeh, но она ничего не отображает, когда значения x основаны на тексте:

x=['-', 'AF', 'AS', 'EU', 'NA', 'OC', 'SA']
y=[8, 7621750, 33785311, 31486697, 38006434, 7312002, 7284879]
p = figure(plot_width=480, plot_height=300,title='test')
p.vbar(x=x, width=0.5, bottom=0, top=y, color="navy", alpha=0.5)
p.toolbar.logo = None
p.toolbar_location = None
v = gridplot([[p]])
show(v)

enter image description here

Мне интересно, если это ошибка. Версия: 0.13.0

После применения предложенного исправления это работает:

for i in range(4):
    ind=i+offset
    rez[ind].sort(key=lambda tup: tup[0])
    x = [x[0] for x in rez[ind]]
    y = [x[1] for x in rez[ind]]
    if type(x[0]) == str:
        charts[i] = figure(
            plot_width=480, 
            plot_height=300,
            title=columns_being_investigated[ind],
            x_range=x)
    else:
        charts[i] = figure(
            plot_width=480, 
            plot_height=300,
            title=columns_being_investigated[ind])
    charts[i].vbar(x=x, width=0.5, bottom=0, top=y, color="navy", alpha=0.5)
    charts[i].toolbar.logo = None
    charts[i].toolbar_location = None

p = gridplot([[charts[0], charts[1]], [charts[2], charts[3]]])
show(p)

1 Ответ

0 голосов
/ 05 сентября 2018

При использовании категориальных (то есть строковых) координат вы должны сообщить Bokeh, в каком порядке должны быть категориальные факторы. Это произвольно, и, на ваш взгляд, нет порядка, который Bokeh мог бы выбрать по умолчанию. Для простых не вложенных категорий это проще всего сделать, передав список в figure в качестве аргумента x_range.

Вся эта информация находится в документации: Обработка категориальных данных

Ваш код обновлен:

from bokeh.plotting import figure, show

x=['-', 'AF', 'AS', 'EU', 'NA', 'OC', 'SA']
y=[8, 7621750, 33785311, 31486697, 38006434, 7312002, 7284879]
p = figure(plot_width=480, plot_height=300,title='test', 

           # you were missing this:
           x_range=['-', 'AF', 'AS', 'EU', 'NA', 'OC', 'SA'])

p.vbar(x=x, width=0.5, bottom=0, top=y, color="navy", alpha=0.5)
p.toolbar.logo = None
p.toolbar_location = None
show(p)

В результате вы получите:

enter image description here

...