利用bokeh实现联动交互,悬浮、滑块、下拉菜单,如下图所示:
from bokeh.io import output_notebook, show, curdoc
from bokeh.plotting import figure
from bokeh.models import HoverTool, ColumnDataSource, Select
from bokeh.models import CategoricalColorMapper
from bokeh.palettes import Spectral6
from bokeh.layouts import row, column
from bokeh.models import Slider
import pandas as pd
data = pd.read_csv('./demo.csv')
# 制作 ColumnDataSource: source
source = ColumnDataSource(data={
'x': data[data.Year == 1970].fertility,
'y': data[data.Year == 1970].life,
'country': data[data.Year == 1970].Country,
'pop': (data[data.Year == 1970].population / 20000000) + 2,
'region': data[data.Year == 1970].region,
})
# 保存 fertility 列的最大值和最小值: xmin, xmax
xmin, xmax = min(data.fertility), max(data.fertility)
# 保存 life expectancy 列的最大值和最小值: ymin, ymax
ymin, ymax = min(data.life), max(data.life)
# 列出 region 列中的唯一值: regions_list
regions_list = data.region.unique().tolist()
# 制作颜色映射器: color_mapper
color_mapper = CategoricalColorMapper(factors=regions_list, palette=Spectral6)
# 创建画布: plot
plot = figure(title='Gapminder Data for 1970', plot_height=400, plot_width=700,
x_range=(xmin, xmax), y_range=(ymin, ymax))
# 将颜色映射器添加到圆形字形
plot.circle(x='x', y='y', fill_alpha=0.8, source=source,
color=dict(field='region', transform=color_mapper), legend_label='region')
# 设置 x 轴标签
plot.xaxis.axis_label = 'Fertility (children per woman)'
# 设置 y 轴标签
plot.yaxis.axis_label = 'Life Expectancy (years)'
# 创建图例位置 'top_right'
plot.legend.location = 'top_right'
# 定义回调函数: update_plot
def update_plot(attr, old, new):
# 将 yr 名称设置为 slider.value,将 new_data 设置为 source.data
yr = slider.value
x = x_select.value
y = y_select.value
# Label axes of plot
plot.xaxis.axis_label = x
plot.yaxis.axis_label = y
# Set new_data
new_data = {
'x' : data[data.Year == yr][x],
'y' : data[data.Year == yr][y],
'country' : data[data.Year == yr].Country,
'pop' : (data[data.Year == yr].population / 20000000) + 2,
'region' : data[data.Year == yr].region,
}
source.data = new_data
# Set the range of all axes
plot.x_range.start = min(data[x])
plot.x_range.end = max(data[x])
plot.y_range.start = min(data[y])
plot.y_range.end = max(data[y])
# Add title to figure
plot.title.text = 'Gapminder data for %d' % yr
### 添加滑块
# 制作滑块对象: slider
slider = Slider(start=1970, end=2010, step=1, value=1970, title='Year')
# 将回调附加到滑块的'value'属性
slider.on_change('value', update_plot)
### 添加悬停工具
# 创建一个悬停工具: hover
hover = HoverTool(tooltips=[('Country', '@country')])
# 在图片中添加悬停工具
plot.add_tools(hover)
### 添加下拉菜单
# 创建 x 的下拉菜单 : x_select
x_select = Select(
options=['fertility', 'life', 'child_mortality', 'gdp'],
value='fertility',
title='x-axis data'
)
# 将 update_plot 回调附加到 x_select 的 'value' 属性
x_select.on_change('value', update_plot)
# 创建 y 的下拉菜单: y_select
y_select = Select(
options=['fertility', 'life', 'child_mortality', 'gdp'],
value='life',
title='y-axis data'
)
# 将 update_plot 回调附加到 y_select 的 'value' 属性
y_select.on_change('value', update_plot)
layout = row(column(slider, x_select, y_select), plot)
curdoc().add_root(layout)
curdoc().title = 'Gapminder'
希望本文的内容对大家的学习或者工作能带来一定的帮助,每天进步一点点,加油。
网友评论