Container as tooltip doesn't show contents

南楼画角 提交于 2019-12-24 08:24:39

问题


I'm creating a scatterplot and want to show some information in a tooltip.

The following works perfectly:

import bqplot as bqp
import ipywidgets as ipw

xSc = bqp.LinearScale()
ySc = bqp.LinearScale()

tt = ipw.Label("A")
def hover_handler(self, content):
    tt.value = str(content)

s = bqp.Scatter(x=[0, 1, 2], y=[1, 2, 3], scales=dict(x=xSc, y=ySc),
                tooltip=tt)
s.on_hover(hover_handler)
bqp.Figure(marks=[s])

(there's no axes and whatnot to keep the code short)

Hovering over each point shows its content just fine.

However, I don't want to simply show the raw content. Instead, I want to show it in tabular form (but the default bqp.Tooltip isn't sufficient for my needs).

However, if I wrap the label in a ipw.VBox, the tooltip becomes a tiny vertical sliver. Adding a min_width and min_height increases the size of the tooltip, but there's no content (even though tt was created with a default value). If I make a separate call to display the VBox alone, that version appears normally (even without defining the layout) and even updates when moving the mouse over the points.

import bqplot as bqp
import ipywidgets as ipw
from IPython.display import display

xSc = bqp.LinearScale()
ySc = bqp.LinearScale()

tt = ipw.Label("A")
vb = ipw.VBox(children=[tt], layout=ipw.Layout(min_width='100px', min_height='100px'))
display(vb)
def hover_handler(self, content):
    tt.value = str(content)

s = bqp.Scatter(x=[0, 1, 2], y=[1, 2, 3], scales=dict(x=xSc, y=ySc),
                tooltip=vb)
s.on_hover(hover_handler)
bqp.Figure(marks=[s])

What do I need to do for the tooltip to appear correctly?


回答1:


I think for what you are trying you achieve you would be better served with an Output widget as a tooltip, and then create the widgets you need and display them using the output widget as a context manager.

If you want to see what additional information could be presented, try printing content within your hover_handler function.

    import bqplot as bqp
    import ipywidgets as ipw
    from IPython.display import display, clear_output

    xSc = bqp.LinearScale()
    ySc = bqp.LinearScale()


    out = ipw.Output()

    def hover_handler(self, content):
        out.clear_output()
        with out:
            label = ipw.Label(content['data']['name'])
            display(label)

    s = bqp.Scatter(x=[0, 1, 2], y=[1, 2, 3], scales=dict(x=xSc, y=ySc),
                    tooltip=out)
    s.on_hover(hover_handler)
    bqp.Figure(marks=[s])

To display a table of information, you probably need an ipy.HTML widget which you can use to pass a HTML table. I sometimes use pandas for this, with the df.to_html() method.



来源:https://stackoverflow.com/questions/56655741/container-as-tooltip-doesnt-show-contents

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!