【问题标题】:How to make mpld3 work with seaborn (interactive tooltips)如何使 mpld3 与 seaborn 一起工作(交互式工具提示)
【发布时间】:2015-07-17 16:55:04
【问题描述】:

我似乎无法让由 mpld3 提供支持的交互式工具提示与 seaborn 的奇妙的类似 lmplot 的散点图一起使用。

我很想知道如何让它发挥作用!谢谢!

示例代码:

# I'm running this in an ipython notebook.
%matplotlib inline
import matplotlib.pyplot as plt, mpld3
mpld3.enable_notebook()
import seaborn as sns


N=10
data = pd.DataFrame({"x": np.random.randn(N),
                     "y": np.random.randn(N), 
                     "size": np.random.randint(20,200, size=N),
                     "label": np.arange(N)
                     })


scatter_sns = sns.lmplot("x", "y", 
           scatter_kws={"s": data["size"]},
           robust=False, # slow if true
           data=data, size=8)
fig = plt.gcf()

tooltip = mpld3.plugins.PointLabelTooltip(fig, labels=list(data.label))
mpld3.plugins.connect(fig, tooltip)

mpld3.display(fig)

我得到了 seaborn 情节以及以下错误:

Javascript error adding output!
TypeError: obj.elements is not a function
See your browser Javascript console for more details.

控制台显示:

TypeError: obj.elements is not a function
    at mpld3_TooltipPlugin.draw (https://mpld3.github.io/js/mpld3.v0.2.js:1161:9)
    at mpld3_Figure.draw (https://mpld3.github.io/js/mpld3.v0.2.js:1400:23)
    at Object.mpld3.draw_figure (https://mpld3.github.io/js/mpld3.v0.2.js:18:9)
    at eval (eval at <anonymous> (https://mbcomp1:9999/static/components/jquery/jquery.min.js:4:4231), <anonymous>:14:14)
    at eval (eval at <anonymous> (https://mbcomp1:9999/static/components/jquery/jquery.min.js:4:4231), <anonymous>:15:5)
    at eval (native)
    at Function.x.extend.globalEval (https://mbcomp1:9999/static/components/jquery/jquery.min.js:4:4231)
    at x.fn.extend.domManip (https://mbcomp1:9999/static/components/jquery/jquery.min.js:5:21253)
    at x.fn.extend.append (https://mbcomp1:9999/static/components/jquery/jquery.min.js:5:18822)
    at OutputArea._safe_append (https://mbcomp1:9999/static/notebook/js/outputarea.js:336:26)
outputarea.js:319 Javascript error adding output! TypeError: obj.elements is not a function
    at mpld3_TooltipPlugin.draw (https://mpld3.github.io/js/mpld3.v0.2.js:1161:9)
    at mpld3_Figure.draw (https://mpld3.github.io/js/mpld3.v0.2.js:1400:23)
    at Object.mpld3.draw_figure (https://mpld3.github.io/js/mpld3.v0.2.js:18:9)
    at eval (eval at <anonymous> (https://mbcomp1:9999/static/components/jquery/jquery.min.js:4:4231), <anonymous>:14:14)
    at eval (eval at <anonymous> (https://mbcomp1:9999/static/components/jquery/jquery.min.js:4:4231), <anonymous>:15:5)
    at eval (native)
    at Function.x.extend.globalEval (https://mbcomp1:9999/static/components/jquery/jquery.min.js:4:4231)
    at x.fn.extend.domManip (https://mbcomp1:9999/static/components/jquery/jquery.min.js:5:21253)
    at x.fn.extend.append (https://mbcomp1:9999/static/components/jquery/jquery.min.js:5:18822)
    at OutputArea._safe_append (https://mbcomp1:9999/static/notebook/js/outputarea.js:336:26)
outputarea.js:338 TypeError: obj.elements is not a function
    at mpld3_TooltipPlugin.draw (https://mpld3.github.io/js/mpld3.v0.2.js:1161:9)
    at mpld3_Figure.draw (https://mpld3.github.io/js/mpld3.v0.2.js:1400:23)
    at Object.mpld3.draw_figure (https://mpld3.github.io/js/mpld3.v0.2.js:18:9)
    at eval (eval at <anonymous> (https://mbcomp1:9999/static/components/jquery/jquery.min.js:4:4231), <anonymous>:14:14)
    at eval (eval at <anonymous> (https://mbcomp1:9999/static/components/jquery/jquery.min.js:4:4231), <anonymous>:15:5)
    at eval (native)
    at Function.x.extend.globalEval (https://mbcomp1:9999/static/components/jquery/jquery.min.js:4:4231)
    at x.fn.extend.domManip (https://mbcomp1:9999/static/components/jquery/jquery.min.js:5:21253)
    at x.fn.extend.append (https://mbcomp1:9999/static/components/jquery/jquery.min.js:5:18822)
    at OutputArea._safe_append (https://mbcomp1:9999/static/notebook/js/outputarea.js:336:26)
outputarea.js:319 Javascript error adding output! TypeError: obj.elements is not a function
    at mpld3_TooltipPlugin.draw (https://mpld3.github.io/js/mpld3.v0.2.js:1161:9)
    at mpld3_Figure.draw (https://mpld3.github.io/js/mpld3.v0.2.js:1400:23)
    at Object.mpld3.draw_figure (https://mpld3.github.io/js/mpld3.v0.2.js:18:9)
    at eval (eval at <anonymous> (https://mbcomp1:9999/static/components/jquery/jquery.min.js:4:4231), <anonymous>:14:14)
    at eval (eval at <anonymous> (https://mbcomp1:9999/static/components/jquery/jquery.min.js:4:4231), <anonymous>:15:5)
    at eval (native)
    at Function.x.extend.globalEval (https://mbcomp1:9999/static/components/jquery/jquery.min.js:4:4231)
    at x.fn.extend.domManip (https://mbcomp1:9999/static/components/jquery/jquery.min.js:5:21253)
    at x.fn.extend.append (https://mbcomp1:9999/static/components/jquery/jquery.min.js:5:18822)
    at OutputArea._safe_append (https://mbcomp1:9999/static/notebook/js/outputarea.js:336:26)

【问题讨论】:

    标签: matplotlib seaborn mpld3


    【解决方案1】:

    我认为目前没有简单的方法可以做到这一点。我可以通过将 tooltip 构造函数替换为以下内容来显示一些工具提示:

    ax = plt.gca()
    pts = ax.get_children()[3]
    tooltip = mpld3.plugins.PointLabelTooltip(pts, labels=list(data.label))
    

    不过,这只适用于不确定区间之外的点。我认为可以扩展seaborn 以使这些点在zorder 中最高,并将它们存储在某个实例中,这样您就不需要将它们从轴子列表中拉出。也许值得提出功能请求。

    【讨论】:

    【解决方案2】:

    我能够通过使用 seaborn 图顶部的标准 matplotlib 散点图和非常低的 alpha(您不能使用零)来使工具提示正常工作

    data_tip_points = ax.scatter(x_points, y_points, alpha=0.001)
    tooltip = plugins.PointLabelTooltip(data_tip_points, labels)
    

    这有点小技巧,但它可以在这里看到。

    http://nbviewer.ipython.org/urls/bitbucket.org/jeff_mcgehee/cds_presentation_intro/raw/49cc7808ec26adebec94ffa83973bb5db13017d7/CDS%20Intro%20Presentation.ipynb

    【讨论】:

      【解决方案3】:

      当使用mpld3.save_html(fig,"./out.html") 将图形保存到文件时,您的代码在ipython(无记事本)上对我有效。可能是ipythonnotepad/mpld3 兼容性或mpld3.display 的问题(虽然我认为这与我计算机上旧版本的matplotlib 有关)。

      对我有用的完整代码是,

      import numpy as np
      import matplotlib.pyplot as plt, mpld3
      import seaborn as sns
      import pandas as pd
      
      N=10
      data = pd.DataFrame({"x": np.random.randn(N),
                           "y": np.random.randn(N), 
                           "size": np.random.randint(20,200, size=N),
                           "label": np.arange(N)
                           })
      
      
      scatter_sns = sns.lmplot("x", "y", 
                 scatter_kws={"s": data["size"]},
                 robust=False, # slow if true
                 data=data, size=8)
      fig = plt.gcf()
      
      tooltip = mpld3.plugins.PointLabelTooltip(fig, labels=list(data.label))
      mpld3.plugins.connect(fig, tooltip)
      
      mpld3.save_html(fig,"./out.html")
      

      【讨论】:

      • 不幸的是,即使导出为 html,我也会遇到同样的错误。如果这是版本问题。我正在使用:mpld3 0.2 matplotlib 1.4.3 seaborn 0.5.1
      猜你喜欢
      • 1970-01-01
      • 2011-03-12
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多