hbar bokeh 1.3.4 с категориальными данными - PullRequest
2 голосов
/ 02 февраля 2020

Я пытаюсь построить категорический график с hbar в bokeh, хотя кажется немного странным, что он не следует той же концепции, что и vbar. Я пробовал несколько вариантов, и я до сих пор не смог построить данные, я только получаю пустой холст. Если бы кто-то мог помочь мне, это было бы очень ценно. Я использую bokeh 1.3.4 в своей системе и в веб-приложении, которое я встраиваю в Flask, так что это должна быть либо эта версия, либо ниже (кажется немного требовательной, но это требования к программному обеспечению). Я сделал это с помощью pandas_bokeh, что делает его очень простым, хотя я добавляю интерактивность к графикам, чтобы позволить зрителю поиграть, а pandas_bokeh выполняет свою работу, и вы в итоге не научились этому должным образом. черновик веб-приложения на данный момент

rX = df3.index.values
xL = ['Dublin New', 'Ireland New','Dublin Existing','Ireland Existing']
labelDict = {'2010': xL, '2011': xL, '2012': xL, '2013': xL, '2014': xL,'2015': xL,'2016': xL,'2017': xL, '2018': xL}

sourceT = ColumnDataSource(data=dict(x=df3.index.values,
                                    y=df3['Dublin New'],
                                    y1=df3['Ireland New'],
                                    y2=df3['Dublin Existing'],
                                    y3=df3['Ireland Existing']))

pT = figure(y_range=FactorRange(*labelDict), plot_height=350, plot_width=550, title='Properties Transactions in Ireland', tools='pan, wheel_zoom, box_zoom, reset')

pT.hbar(y=dodge('x', -0.5, range=pT.y_range), height=0.3, right='y', fill_color="#FDE724", source=sourceT)
#pT.hbar(y=dodge('x', -0.25, range=pT.y_range), height=0.3, right='y1', fill_color='#35B778', source=sourceT)
show(pT)

Вот график, который я хотел бы воспроизвести, используя bokeh, вместо pandas_bokeh. pandas_bokeh plot

Заранее спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Значение параметра range для dodge должно быть фактическим диапазоном:

range=pT.y_range   # GOOD

Передается свойство диапазона end, представляющее собой число:

range=pT.y_range.end  # BAD

РЕДАКТИРОВАТЬ: Без полного минимального воспроизводителя невозможно напрямую исправить ваш код . Лучшее, что можно предложить, - это полный рабочий пример, демонстрирующий, что hbar работает точно так же, как vbar, который, надеюсь, будет полезен вам для сравнения, чтобы выяснить, где ваш полный код отклоняется:

from bokeh.io import show
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure
from bokeh.transform import dodge

fruits = ['Apples', 'Pears', 'Nectarines', 'Plums', 'Grapes', 'Strawberries']
years = ['2015', '2016', '2017']

data = {'fruits' : fruits,
        '2015'   : [2, 1, 4, 3, 2, 4],
        '2016'   : [5, 3, 3, 2, 4, 6],
        '2017'   : [3, 2, 4, 4, 5, 3]}

source = ColumnDataSource(data=data)

p = figure(y_range=fruits, x_range=(0, 10), plot_width=250, title="Fruit Counts by Year",
           toolbar_location=None, tools="")

p.hbar(y=dodge('fruits', -0.25, range=p.y_range), right='2015', height=0.2, source=source,
       color="#c9d9d3")

p.hbar(y=dodge('fruits',  0.0,  range=p.y_range), right='2016', height=0.2, source=source,
       color="#718dbf")

p.hbar(y=dodge('fruits',  0.25, range=p.y_range), right='2017', height=0.2, source=source,
       color="#e84d60")

p.y_range.range_padding = 0.1
p.ygrid.grid_line_color = None

show(p)

enter image description here

0 голосов
/ 03 февраля 2020

@ bigreddot Большое спасибо. Я следовал вашему подходу, и он работает гладко. Я постараюсь зарезервировать ось так, как я бы хотел, чтобы годы были в яси. В любом случае, я действительно оценил вашу помощь.

varT = ['Dublin New', 'Ireland New', 'Dublin Existing','Ireland Existing']
yearsT = df3.index.values.tolist()

dataT = {'var': var,
        '2010': df3.iloc[0].values, '2011': df3.iloc[1].values,
        '2012': df3.iloc[2].values, '2013': df3.iloc[3].values,
        '2014': df3.iloc[4].values, '2015': df3.iloc[5].values,
        '2016': df3.iloc[6].values, '2017': df3.iloc[7].values,
        '2018': df3.iloc[8].values,
        }

sourceTs = ColumnDataSource(data=dataT)

pT1 = figure(y_range=var, x_range=(0, df3.values.max()), plot_width=450, title='Properties Transactions in Ireland', tools='pan, wheel_zoom, box_zoom, reset')
pT1.hbar(y=dodge('var', -0.4, range=pT1.y_range), right='2010', height=0.1, source=sourceTs, color='#440154', legend=value('2010'))
pT1.hbar(y=dodge('var', -0.3, range=pT1.y_range), right='2011', height=0.1, source=sourceTs, color='#46317E', legend=value('2011'))
pT1.hbar(y=dodge('var', -0.2, range=pT1.y_range), right='2012', height=0.1, source=sourceTs, color='#365A8C', legend=value('2012'))
pT1.hbar(y=dodge('var', -0.1, range=pT1.y_range), right='2013', height=0.1, source=sourceTs, color='#277E8E', legend=value('2013'))
pT1.hbar(y=dodge('var', 0, range=pT1.y_range), right='2014', height=0.1, source=sourceTs, color='#1EA087', legend=value('2014'))
pT1.hbar(y=dodge('var', 0.1, range=pT1.y_range), right='2015', height=0.1, source=sourceTs, color='#49C16D', legend=value('2015'))
pT1.hbar(y=dodge('var', 0.2, range=pT1.y_range), right='2016', height=0.1, source=sourceTs, color='#9DD93A', legend=value('2016'))
pT1.hbar(y=dodge('var', 0.3, range=pT1.y_range), right='2017', height=0.1, source=sourceTs, color='#FDE724', legend=value('2017'))
pT1.hbar(y=dodge('var', 0.4, range=pT1.y_range), right='2018', height=0.1, source=sourceTs, color='#AADB32', legend=value('2018'))
pT1.legend.location='bottom_right'
#pT1.y_range.range_padding = 0.1
pT1.grid.grid_line_color = None
tick_labels_pt = {'10000':'10K','20000':'20K','30000':'30K','40000':'40K','50000':'50K'}
pT1.xaxis.major_label_overrides = tick_labels_pt
pT1.legend.background_fill_alpha=None
pT1.legend.border_line_alpha=0
pT1.legend.label_text_font_size = "11px"
pT1.legend.click_policy="hide"
pT1.title.text_font_size = '15px'
pT1.axis.major_label_text_font_style = 'bold'
#pT1.xaxis.major_label_text_font_style = 'bold'
pT1.toolbar.autohide = True

show(pT1)

Вот результат: Categorical_hbar

с перевернутой осью:

varpti = ['Dublin New', 'Ireland New', 'Dublin Existing','Ireland Existing']
#the values of the y axis has to be in str format
yearspti = '2010','2011','2012', '2013', '2014', '2015', '2016', '2017', '2018' #df3.index.values.tolist()

datapti = {'years': yearspti,
           'Dublin New': df3['Dublin New'].values,
           'Ireland New': df3['Ireland New'].values,
           'Dublin Existing': df3['Dublin Existing'].values,
           'Ireland Existing': df3['Ireland Existing'].values
        }

sourcepti = ColumnDataSource(data=datapti)

pti = figure(y_range=yearspti, x_range=(0, df3.values.max()), plot_height=500, plot_width=450, title='Properties Transactions in Ireland', tools='pan, wheel_zoom, box_zoom, reset')
pti.hbar(y=dodge('years', -0.2, range=pti.y_range), right='Dublin New', height=0.1, source=sourcepti, color='#440154', legend=value('Dublin New'))
pti.hbar(y=dodge('years', 0, range=pti.y_range), right='Ireland New', height=0.1, source=sourcepti, color='#30678D', legend=value('Ireland New'))
pti.hbar(y=dodge('years', 0.2, range=pti.y_range), right='Dublin Existing', height=0.1, source=sourcepti, color='#35B778', legend=value('Dublin Exsiting')) 
pti.hbar(y=dodge('years', 0.4, range=pti.y_range), right='Ireland Existing', height=0.1, source=sourcepti, color='#FDE724', legend=value('Ireland Exsiting'))

reserved_axis

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...