使用此处的示例
是否可能使用Bar对象实现上述交互?我卡在了从哪里获取数据以便在滑块移动时更新条形图。我真的不想每次滑块移动时都需要显式地从基元素重新构建整个条形图。
非常感谢任何帮助。我的最后一次尝试如下:
http://docs.bokeh.org/en/latest/docs/gallery/stacked_bar_chart.html
这里还附带交互示例:
http://docs.bokeh.org/en/latest/docs/user_guide/interaction.html#userguide-interaction
似乎使用滑块改变堆叠条形图的可视化效果应该是非常直接的。然而,问题在于来自bokeh.charts库的Bar对象没有公开渲染在条形图中的数据源。据我所知,这是因为charts模块没有维护这些数据。是否可能使用Bar对象实现上述交互?我卡在了从哪里获取数据以便在滑块移动时更新条形图。我真的不想每次滑块移动时都需要显式地从基元素重新构建整个条形图。
非常感谢任何帮助。我的最后一次尝试如下:
from collections import OrderedDict
import pandas as pd
from bokeh.charts import Bar, output_file, show
from bokeh.sampledata.olympics2014 import data
from bokeh.io import vform
from bokeh.models import Callback, ColumnDataSource, Slider
from bokeh.plotting import figure
output_file("callback_bar_graph.html")
df = pd.io.json.json_normalize(data['data'])
# filter by countries with at least one medal and sort
df = df[df['medals.total'] > 0]
df = df.sort("medals.total", ascending=False)
# get the countries and we group the data by medal type
countries = df.abbr.values.tolist()
gold = df['medals.gold'].astype(float).values
silver = df['medals.silver'].astype(float).values
bronze = df['medals.bronze'].astype(float).values
# build a dict containing the grouped data
medals = OrderedDict(bronze=bronze, silver=silver, gold=gold)
# any of the following commented are also alid Bar inputs
medals = pd.DataFrame(medals)
source = ColumnDataSource(data=dict(medals=medals, countries=countries))
bar = Bar(medals, countries, title="Stacked bars", stacked=True)
callback = Callback(args=dict(source=source), code="""
var data = source.get('data');
var f = cb_obj.get('value')
medals = data['medals']
countries = data['countries']
for (i = 0; i < medals.bronze.length; i++) {
medals.bronze[i] = 2*medals.bronze[i]
}
source.trigger('change');
""")
slider = Slider(start=-2, end=2, value=1, step=.1,
title="value", callback=callback)
layout = vform(slider, bar)
show(layout)