selection - Bokeh 1.0.4 - 使用交互式图例跨多个字形选择不包括所有字形
问题描述
我正在使用交互式图例,如下例所示
import pandas as pd
from bokeh.palettes import Spectral4
from bokeh.plotting import figure, output_file, show
from bokeh.sampledata.stocks import AAPL, IBM, MSFT, GOOG
p = figure(plot_width=800, plot_height=250,
tools=('pan, lasso_select, reset'),
active_drag='lasso_select',
x_axis_type="datetime")
p.title.text = 'Click on legend entries to mute the corresponding lines'
for data, name, color in zip([AAPL, IBM, MSFT, GOOG], ["AAPL", "IBM", "MSFT", "GOOG"], Spectral4):
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])
p.circle(df['date'], df['close'], line_width=2, color=color, alpha=0.8,
#selection_color='black',
nonselection_color='gray',
muted_color='gray', muted_alpha=0.2, legend=name)
p.legend.location = "top_left"
p.legend.click_policy="mute"
output_file("interactive_legend.html", title="interactive_legend.py example")
show(p)
释放鼠标后,我看到:
请注意,MSFT 和 GOOG 的点仍然处于选中状态,即使它们都不在选择区域内。
在这种情况下,我希望它们成为未选中的(灰色)。
显然,如果字形中没有一个点位于选择区域内,则该字形的所有点都保持选中状态(即选择工具不包括图中的所有字形)。
谢谢您的帮助!
解决方案
不幸的是,这是LassoSelectTool
. 但是,我可以为您提供一个很好的解决方法,如果未选择它们的点,它将隐藏字形。然后您可以使用 ResetTool 将它们显示回来。我希望它对你有用。
import pandas as pd
from bokeh.palettes import Spectral4
from bokeh.models import LassoSelectTool, ResetTool, CustomJS, LegendItem, Legend, ColumnDataSource
from bokeh.plotting import figure, output_file, show
from bokeh.sampledata.stocks import AAPL, IBM, MSFT, GOOG
p = figure(plot_width = 800, plot_height = 250,
tools = ('pan,reset'),
x_axis_type = "datetime")
p.title.text = 'Click on legend entries to mute the corresponding lines'
sources = []
backup_colors = []
stocks = ["AAPL", "IBM", "MSFT", "GOOG"]
for data, name, color in zip([AAPL, IBM, MSFT, GOOG], stocks, Spectral4):
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])
sources.append(ColumnDataSource(dict(x = df['date'], y = df['close'], color = len(df['close'].values) * [color])))
backup_colors.append(len(df['close'].values) * [color])
renderers = []
for index, name in enumerate(['AAPL', 'IBM', 'MSFT', 'GOOG']):
source = sources[index]
renderers.append(p.circle(x = 'x',
y = 'y',
color = 'color',
source = source,
line_width = 2,
alpha = 0.8,
nonselection_color = 'gray',
muted_color = 'gray',
muted_alpha = 0.2,
legend = name))
legend_items = [LegendItem(label = stocks[index], renderers = [renderer], name = stocks[index]) for index, renderer in enumerate(renderers)]
legend = Legend(items = legend_items, name = 'stocks_legend')
p.add_layout(legend)
p.legend.click_policy = 'hide'
greys = len(backup_colors[0]) * ['#888888']
code = ''' selected_line = null;
for (index in renderers){
renderer = renderers[index];
if (renderer.data_source.selected.indices.length > 0)
{
selected_line = renderer.data_source.selected.indices.length
break;
}
}
if (selected_line != null){
for (index in renderers){
renderer = renderers[index];
if (renderer.data_source.selected.indices.length == 0){
renderer.data_source.data['color'] = greys
renderer.data_source.change.emit();
}
}
}'''
lasso_select_tool = LassoSelectTool(select_every_mousemove = False)
lasso_select_tool.callback = CustomJS(args = dict(renderers = renderers, greys = greys), code = code)
p.add_tools(lasso_select_tool)
p.legend.location = "top_left"
p.legend.click_policy = "mute"
code = ''' for (index in renderers){
renderer = renderers[index];
renderer.data_source.data['color'] = colors[index];
renderer.data_source.change.emit();
} '''
p.js_on_event('reset', CustomJS(args = dict(renderers = renderers, colors = backup_colors), code = code))
show(p)
结果:
推荐阅读
- java - 使用 Spring Boot 在运行时以编程方式更改 application.properties 文件
- regex - 比较两个文件而不对 AWK 进行排序
- ios - 如何使用 Xcode 在 Launchscreen.storyboard 中为 UILabel 指定“等宽系统字体”?
- django - 无法在 Django 中将当前用户设置为帖子的作者
- android - 为什么 iOS Safari 浏览器中的 padding 和 margin 看起来不同?
- python - 将csv文件中的两列数据一起添加到python中同一csv文件中的新列中
- python - 将值“附加”到特定键的字典中
- angular - 正则表达式会中断 Angular 延迟加载模块的加载(仅限 Safari)
- java - 当我尝试使用多个查询参数调用端点时得到 404
- sql - 查询在简单选择上花费的时间太长