iPython / Jupyter Notebook:如何使用Desmos API嵌入交互式图形?

时间:2015-11-22 21:08:08

标签: javascript python ipython ipython-notebook jupyter

我最近从使用笔纸系统的微积分II课程笔记切换到使用Jupyter(以前称为iPython)笔记本。有什么区别!

无论如何,作为通过视觉演示学习得最好的人,我真的想在我的笔记本中嵌入一些互动的Desmos图表(对于那些不熟悉Desmos的人来说,它是一个非常强大而又容易的 - 使用,基于网络的图形计算器)。

不幸的是,iPython / Jupyter笔记本security model阻止了Markdown单元格中嵌入的JavaScript的执行。我相信HTML清理库(Google Caja)会删除您放入Markdown单元格的所有HTML标记和JavaScript代码。

根据note in the security model docs,计划支持某种允许HTML / CSS用于笔记本主题的机制。但该说明未提及JavaScript支持。

我意识到跨站点脚本是一个严重的问题而且很难防范,但是真的没有办法放松笔记本作者的安全限制吗?也许将来可能会在笔记本元数据中添加一个配置选项(可以在笔记本会话中编辑)以指定允许的标签列表。

与此同时,是否有人知道使用笔记本电脑中的Markdown单元格中的第三方API嵌入输出的解决方法,黑客攻击或其他方法?

如果要在Python单元格中使用Python打印相应的HTML和JavaScript代码,是否会避免这些限制?也许我应该为Desmos API写一个Python包装器......

3 个答案:

答案 0 :(得分:1)

我认为有几种方法可以实现它

  • 使用iframe
  • 使用原始html显示,可能需要你写 一些包装首先使其可重复使用
  • 使用一些3方lib:mpld3,plot.js,这里是list
  • 使用其他类型的3方lib:IPython-Dashboard

答案 1 :(得分:0)

您始终可以使用IPython小部件中的交互

from IPython.html.widgets import *
import numpy as np
import matplotlib.pyplot as plt
import math

def linear(w,x,b):
    return w*x + b

def logistic(z):
    return 1/(1+math.e**(-z))

def plt_logistic(a, b):
    x = np.linspace(-20,20, 100)
    h = linear(a,x,b)
    y = logistic(h)
    plt.ylim(-5,5)
    plt.xlim(-5,5)
    plt.plot(x,h)
    plt.plot(x,y)
    plt.grid()
    plt.show()

interact(plt_logistic, a = (-10,10,0.1), b = (-10,10,0.1))

enter image description here

答案 2 :(得分:0)

以下是使用jp_proxy小部件将Desmos嵌入Jupyter的方法:

enter image description here

请参阅https://github.com/AaronWatters/jp_proxy_widget -此代码基于快速入门示例:https://www.desmos.com/api/v1.2/docs/index.html