代码之家  ›  专栏  ›  技术社区  ›  Dmitriy Apollonin

在Bokeh中悬停多行图示符时,如何显示单个值?

  •  6
  • Dmitriy Apollonin  · 技术社区  · 8 年前

    至于现在,我看到Bokeh支持多线图示符的悬停工具。 但问题是,如果我想显示点的特定值,它会显示所有值列表,而不是它。

    请参见以下示例:

    from bokeh.plotting import show, figure
    from bokeh.models import ColumnDataSource, HoverTool
    
    df = {'X_value': [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]], 
          'model': ['m1', 'm1', 'm2', 'm2'], 
          'color': ['red', 'red', 'blue', 'blue'],
          'Y_value': [[0.50, 0.66, 0.70, 0.67], [0.65, 0.68, 0.71, 0.66], [0.80, 0.79, 0.84, 0.80], [0.80, 0.83, 0.76, 0.64]]}
    
    source = ColumnDataSource(df)
    
    p = figure(plot_height=400)
    p.multi_line(xs='X_value', ys='Y_value', legend="model", color='color',
                 line_width=5, line_alpha=0.6, hover_line_alpha=1.0,
                 source=source)
    
    p.add_tools(HoverTool(show_arrow=False, line_policy='next', tooltips=[
        ('X_value', '@X_value'),
        ('Y_value', '@Y_value')
    ]))
    
    show(p)
    

    enter image description here

    我知道$x,$y的能力,但这显示了鼠标下的协调,并且它们随着鼠标的移动而变化,这不是期望的行为。

    有没有办法在multi\u线图示符中显示悬停点的精确值?

    p、 创建不可见线并不是一个解决方案,因为我有更高级的带有过滤和链接图等的图。

    谢谢

    2 回复  |  直到 7 年前
        1
  •  6
  •   ChesuCR Ayansplatt    8 年前

    如果更新到bokeh版本0.12.16,则可以使用新类 CustomJSHover 像这样:

    from bokeh.plotting import show, figure
    from bokeh.models import ColumnDataSource, HoverTool
    from bokeh.models.tools import CustomJSHover
    
    
    df = {'X_value': [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]], 
          'model': ['m1', 'm1', 'm2', 'm2'], 
          'color': ['red', 'red', 'blue', 'blue'],
          'Y_value': [[0.50, 0.66, 0.70, 0.67], [0.65, 0.68, 0.71, 0.66], [0.80, 0.79, 0.84, 0.80], [0.80, 0.83, 0.76, 0.64]]}
    
    source = ColumnDataSource(df)
    
    p = figure(plot_height=400)
    p.multi_line(xs='X_value', ys='Y_value', legend="model", color='color',
                 line_width=5, line_alpha=0.6, hover_line_alpha=1.0,
                 source=source)
    
    x_custom = CustomJSHover(code="""
        return '' + special_vars.data_x
    """)
    
    y_custom = CustomJSHover(code="""
        return '' + special_vars.data_y
    """)
    
    p.add_tools(
        HoverTool(
            show_arrow=False, 
            line_policy='next',
            tooltips=[
                ('X_value', '@X_value{custom}'),  # or just ('X_value', '$data_x')
                ('Y_value', '@Y_value{custom}')
            ],
            formatters=dict(
                X_value=x_custom,
                Y_value=y_custom
            )
        )
    )
    
    show(p)
    
        2
  •  1
  •   Paul Netherwood    7 年前

    下面是Dmitry在上述回答中的评论,他说data\u x和data\u y现在已公开,因此您只需将代码更改为:

    p.add_tools(HoverTool(show_arrow=False, line_policy='next', tooltips=[
        ('X_value', '$data_x'),
        ('Y_value', '$data_y')
    ]))
    

    但它的优点是可以使用Bokeh格式化程序。e、 g.这是我用于日期-时间轴上的值,例如:

    plot.add_tools(HoverTool(tooltips=
        [
            ('Date',  '$data_x{%F}'),
            ('Level', '$data_y{0,0.000000}'),
            ('Ticket', '@ticket')
        ],
        formatters={
            '$data_x': 'datetime',
        }
    ))