Python Bokeh将散点图与CDSView源数据联系起来-';悬停颜色';仅适用于图中的最后一个图示符

Python Bokeh将散点图与CDSView源数据联系起来-';悬停颜色';仅适用于图中的最后一个图示符,python,bokeh,Python,Bokeh,我将两个散点图与Bokeh链接起来,这两个散点图的底层数据框架与源数据框架相同 我正在使用CDS视图对数据进行切片。问题在于,悬停颜色(金色)用于标识两个图表中的数据点(链接刷涂),仅适用于每个图形中的最后一个图示符,即黑色汽车。红色圆点在悬停时不会变成金色,只有黑色圆点会变成金色-请参见图片 我发现如果我改变字形编码的顺序(即先黑后红),那么红点变成金色,而不是黑色。。。我想让所有的点在两个图表上都变成金色,无论它们属于哪个符号 我花了很多时间试图找到解决这个问题的办法,但没有成功。我对博克来

我将两个散点图与Bokeh链接起来,这两个散点图的底层数据框架与源数据框架相同

我正在使用CDS视图对数据进行切片。问题在于,悬停颜色(金色)用于标识两个图表中的数据点(链接刷涂),仅适用于每个图形中的最后一个图示符,即黑色汽车。红色圆点在悬停时不会变成金色,只有黑色圆点会变成金色-请参见图片

我发现如果我改变字形编码的顺序(即先黑后红),那么红点变成金色,而不是黑色。。。我想让所有的点在两个图表上都变成金色,无论它们属于哪个符号

我花了很多时间试图找到解决这个问题的办法,但没有成功。我对博克来说比较陌生,可能错过了一些明显的东西。我们将非常感谢您的帮助

import pandas as pd
import bokeh.plotting as bk
from bokeh.models.sources import ColumnDataSource, CDSView
from bokeh.io import show
from bokeh.layouts import row
from bokeh.models.tools import HoverTool
from bokeh.models.filters import GroupFilter

data = {'Make':  ['Tesla', 'Honda', 'VW', 'Audi' ],
        'Color': ['black', 'black', 'red', 'red' ],
        'Price': [12, 23, 54, 78 ],
        'Hp': [64, 28, 12, 11 ],
        'Score': [125, 128, 112, 111 ],
        'Milage': [64, 228, 212, 211 ],
        'Origin': ['USA', 'Japan', 'Germany', 'Germany' ]}

df = pd.DataFrame (data, columns = ['Make','Color','Price','Hp', 'Score', 'Milage', 'Origin'])
source = ColumnDataSource(df)
   
view_red = CDSView(source=source, filters=[GroupFilter(column_name='Color', group='red')])
view_black = CDSView(source=source, filters=[GroupFilter(column_name='Color', group='black')])

#-----

TOOLS = 'box_select, pan, box_zoom, reset'
f1 = bk.figure(plot_width=400, plot_height=300, tools=TOOLS)

reds = f1.circle('Score', 'Price', fill_color="red", fill_alpha=1.0,
                 hover_color='gold', legend_label="red", 
                 size=15, view=view_red, source=source)
    
blacks = f1.hex('Score', 'Price', fill_color="black", fill_alpha=1.0,
                  hover_color='gold', legend_label="black", 
                  size=15, view=view_black, source=source)

hover = HoverTool(mode = 'mouse')
hover.tooltips = [('Make', '@Make'), ('Price', '@Price'), ('Color', '@Color')]
f1.add_tools(hover)

#-----

f2 = bk.figure(plot_width=400, plot_height=300, tools=TOOLS)

reds = f2.circle('Hp', 'Milage', fill_color="red", fill_alpha=1.0,
                 hover_color='gold', legend_label="red", 
                 size=15, view=view_red, source=source)
    
blacks = f2.hex('Hp', 'Milage', fill_color="black", fill_alpha=1.0,
                  hover_color='gold', legend_label="black", 
                  size=15, view=view_black, source=source)

hover = HoverTool(mode = 'mouse')
hover.tooltips = [('Hp', '@Hp'), ('Origin', '@Origin'), ('Color', '@Color')]
f2.add_tools(hover)

#-----

charts = row(children=[f1, f2])
show(charts)
为了完整性:这个简化的示例构成了一个较大脚本的一部分,该脚本具有显示每个图表中的图示符的按钮。谢谢


博凯的布莱恩告知这是一个已知问题,并提供了一个解决方法,即使用不同的CD,即一张用于圆圈,另一张用于六边形。缺点是数据将被复制,但它解决了上述问题

import pandas as pd
import bokeh.plotting as bk
from bokeh.models.sources import ColumnDataSource, CDSView
from bokeh.io import show
from bokeh.layouts import row
from bokeh.models.tools import HoverTool
from bokeh.models.filters import GroupFilter

data = {'Make':  ['Tesla', 'Honda', 'VW', 'Audi' ],
        'Color': ['black', 'black', 'red', 'red' ],
        'Price': [12, 23, 54, 78 ],
        'Hp': [64, 28, 12, 11 ],
        'Score': [125, 128, 112, 111 ],
        'Milage': [64, 228, 212, 211 ],
        'Origin': ['USA', 'Japan', 'Germany', 'Germany' ]}

df = pd.DataFrame (data, columns = ['Make','Color','Price','Hp', 'Score', 'Milage', 'Origin'])
source = ColumnDataSource(df)
source2 = ColumnDataSource(df)
   
view_red = CDSView(source=source, filters=[GroupFilter(column_name='Color', group='red')])
view_black = CDSView(source=source2, filters=[GroupFilter(column_name='Color', group='black')])

#-----

TOOLS = 'box_select, pan, box_zoom, reset'
f1 = bk.figure(plot_width=400, plot_height=300, tools=TOOLS)

reds = f1.circle('Score', 'Price', fill_color="red", fill_alpha=1.0,
                 hover_color='gold', legend_label="red", 
                 size=15, view=view_red, source=source)
    
blacks = f1.hex('Score', 'Price', fill_color="black", fill_alpha=1.0,
                  hover_color='gold', legend_label="black", 
                  size=15, view=view_black, source=source2)

hover = HoverTool(mode = 'mouse')
hover.tooltips = [('Make', '@Make'), ('Price', '@Price'), ('Color', '@Color')]
f1.add_tools(hover)

#-----

f2 = bk.figure(plot_width=400, plot_height=300, tools=TOOLS)

reds = f2.circle('Hp', 'Milage', fill_color="red", fill_alpha=1.0,
                 hover_color='gold', legend_label="red", 
                 size=15, view=view_red, source=source)
    
blacks = f2.hex('Hp', 'Milage', fill_color="black", fill_alpha=1.0,
                  hover_color='gold', legend_label="black", 
                  size=15, view=view_black, source=source2)

hover = HoverTool(mode = 'mouse')
hover.tooltips = [('Hp', '@Hp'), ('Origin', '@Origin'), ('Color', '@Color')]
f2.add_tools(hover)

#-----

charts = row(children=[f1, f2])
show(charts)
有关该问题的更多信息,请参见: