Это часть сгруппированного DataFrame, над которым я работаю.У меня есть несколько переменных для нескольких стран и лет.Как построить точечный график, используя bokeh, на котором отображается gdp_share
на оси x, military_exp
на оси y и ползунок, который идет с 2010 по 2017 год (годы, которые охватывает мой фрейм данных)?
gdp_share military_exp pop gdp gdp_pc military_pc
year Country
2010 China 2.0 138028416.0 1359755 13615620000 10226.87 101.509769
France 2.0 54569820.0 63027 2559460000 39449.38 865.816555
Germany 1.0 41488240.0 80895 3587004000 43928.90 512.865319
Israel 6.0 15044490.0 7426 241692000 32665.37 2025.921088
2011 China 2.0 149022400.0 1367480 14957177000 11180.83 108.975927
France 2.0 53235512.0 63344 2612677000 40078.52 840.419172
Germany 1.0 40301428.0 80934 3718288000 45633.17 497.954234
Israel 6.0 15582490.0 7569 254299000 33733.19 2058.725063
2012 China 2.0 161796896.0 1375199 16211650000 12058.70 117.653442
France 2.0 52499752.0 63640 2617451000 39961.04 824.948963
Germany 1.0 41262500.0 81066 3736582000 45771.68 508.998840
Israel 6.0 15728390.0 7699 259884000 33840.45 2042.913365
И это то, что я пробовал до сих пор:
from bokeh.io import output_file, show, curdoc
from bokeh.layouts import widgetbox, column
from bokeh.models import ColumnDataSource, Slider
from bokeh.plotting import figure
N = data.unstack("year")
source = ColumnDataSource(data = data)
#Create plot and widgets
plot = figure()
plot.circle(x = data.unstack('Country')['gdp_pc'], y = data.unstack('Country')['military_pc'], source = source)
slider = Slider(start = 2010, end = 2017, value = N, step = 1, title = "Years")
#Add callback to widget
def callback(attr, old, new):
N = slider.value
source.data = {"x" : data.unstack('Country')['gdp_pc'], "y" : data.unstack('Country')['military_pc']}
slider.on_change("value", callback)
#Arrange plots and widgets in layouts
layout = column(slider, plot)
curdoc().add_root(layout)
Чего мне не хватает?это ошибка, которую я продолжаю получать:
RuntimeError:
Supplying a user-defined data source AND iterable values to glyph methods is
not possibe. Either:
Pass all data directly as literals:
p.circe(x=a_list, y=an_array, ...)
Or, put all data in a ColumnDataSource and pass column names:
source = ColumnDataSource(data=dict(x=a_list, y=an_array))
p.circe(x='x', y='y', source=source, ...)