боке категориальное vbar, x_range не работает

Раньше я делал в основном один и тот же график с другими данными, я точно не знаю, почему, но этот настаивает на том, что не подведет меня, как только я вставлю в него x_range. Этот код ниже работает просто отлично, хотя у меня нет всех лет на оси X.

dfnt = dfn[['Total Transactions', 'Total Non-Occupiers']]
xr = str(dfnt.index.values)
xl = ['Total Transactions', 'Total Non-Occupiers']
ld = {'2010':xl, '2011':xl, '2012':xl, '2013':xl, '2014':xl, '2015':xl, '2016':xl, '2017':xl, '2018':xl}
rowX = ['2010', '2011','2012','2013','2014','2015','2016', '2017', '2018']
#x1 = [(y, t) for y in rowX for t in xl]


sourcent = ColumnDataSource(data=dict( x = list(dfnt.index.values),
                                    y=dfnt['Total Transactions'],
                                    y1=dfnt['Total Non-Occupiers']))
pn = figure(plot_height=350, plot_width=550, title='Properties Transactions', y_axis_label=None, x_axis_label=None, tools = 'pan, wheel_zoom, box_zoom, reset')
pn.vbar(x=dodge('x', 0.0), top='y', width=0.3, source=sourcent, color='#440154', legend=value('Total Transactions'))
pn.vbar(x=dodge('x', -0.35), top='y1', width=0.3, source=sourcent, color='#FDE724', legend=value('Total Non-Occupiers'))
pn.legend.location = 'top_left'
hoverpn = HoverTool()
hoverpn.tooltips=[('Transactions', 'overall @y / non-occupiers @y1')]
pn.add_tools(hoverpn)
tick_labelspn = {'10000':'10K','20000':'20K','30000':'30K','40000':'40K','50000':'50K', '60000':'60K'}
pn.yaxis.major_label_overrides = tick_labelspn
pn.legend.background_fill_alpha=None
pn.legend.border_line_alpha=0
pn.legend.label_text_font_size = "11px"
pn.y_range.end = dfnt.values.max()*1.1+1
pn.legend.click_policy="hide"
pn.title.text_font_size = '15px'
pn.xaxis.major_label_text_font_style = 'bold'
pn.grid.grid_line_color=None
pn.toolbar.autohide = True
show(pn)

без x_range

Как только я добавлю в него x_range, полосы исчезнут.

pn = figure(x_range=FactorRange(*ld),plot_height=350, plot_width=550, title='Properties Transactions', y_axis_label=None, x_axis_label=None, tools = 'pan, wheel_zoom, box_zoom, reset')

Набор данных или dfnt приведен ниже в случае: dfnt


person ReinholdN    schedule 07.02.2020    source источник
comment
Являются ли годы в наборе данных числами или строками?   -  person bigreddot    schedule 07.02.2020
comment
@bigreddot строка   -  person ReinholdN    schedule 07.02.2020
comment
@bigreddot, который был кортежем, я сделал следующее: xstr = ' '.join(map(str, rowX)) Вместо этого получил ошибку: ОШИБКА: bokeh.core.validation.check: E-1019 (DUPLICATE_FACTORS): FactorRange должен указать уникальный список категориальных факторов для оси: дублировать найдены коэффициенты: '2', '0', '1', ''   -  person ReinholdN    schedule 07.02.2020
comment
Я не совсем слежу. Что такое кортеж? Это сообщение выглядит так, как будто вы дали список отдельных символов для факторов или диапазон факторов. Это должен быть список (строка) лет, и сами данные (в CDS) также должны быть (строка) годами.   -  person bigreddot    schedule 07.02.2020
comment
@bigreddot извините за путаницу! Я попытался добавить только годы в виде строки, как показано выше: xstr = ' '.join(map(str, rowX), что дало мне ошибку 1019. Раньше я использовал словарь, который я уже давно использую для боке, такой как ниже: xl = ['Total Transactions', 'Total Non-Occupiers'] ld = {'2010':xl, '2011':xl, '2012':xl, '2013':xl, '2014':xl, '2015':xl, '2016':xl, '2017':xl, '2018':xl} затем добавил его на рисунок:   -  person ReinholdN    schedule 07.02.2020
comment
pn = figure(x_range=FactorRange(*ld),plot_height=350, plot_width=550, title='Properties Transactions', y_axis_label=None, x_axis_label=None, tools = 'pan, wheel_zoom, box_zoom, reset') Что дало мне пустой холст   -  person ReinholdN    schedule 07.02.2020
comment
@bigreddot спасибо, чувак. Я исправил, я запутался. Это было проще, чем я думал.   -  person ReinholdN    schedule 08.02.2020
comment
Рад слышать! Можете ли вы сами ответить и принять?   -  person bigreddot    schedule 08.02.2020


Ответы (1)


Спасибо @bigreddot, этот парень кажется гуру боке в этом сообществе. В любом случае сохраните строковый формат. Я использовал df.index в CDS как x, это должна быть строковая переменная, объявленная вне CDS, которая будет использоваться в обоих местах (CDS/x_range), как показано ниже:

rowX = '2010', '2011','2012','2013','2014','2015','2016', '2017', '2018'
sourcent = ColumnDataSource(data=dict( x = rowX,
                                    y=dfnt['Total Transactions'],
                                    y1=dfnt['Total Non-Occupiers']))
pn = figure(x_range=rowX, plot_height=350, plot_width=550, title='Properties Transactions in Ireland', y_axis_label=None, x_axis_label=None, tools = 'pan, wheel_zoom, box_zoom, reset')

Который будет работать нормально.

person ReinholdN    schedule 11.02.2020