我最终希望将数据从python数据结构传递给Javascript元素,这些元素将在iPython Notebook中的Dygraphs图形中呈现。
我是新手使用笔记本电脑,尤其是javascript / nobebook互动。我在我的机器上本地保存了最新的Dygraphs库。至少,我希望能够使用该库在笔记本中渲染样本Dygraphs图。
请参阅下面的笔记本。我正在尝试使用此处提供的库执行简单的Dygraphs示例代码:http://dygraphs.com/1.0.1/dygraph-combined.js
然而,我似乎无法渲染任何东西。这是嵌入/调用库然后从笔记本中运行javascript的正确方法吗?
最终我想从Pandas DataFrames生成JSON并将该数据用作Dygraphs输入。
答案 0 :(得分:2)
诀窍是将DataFrame传递给JavaScript并将其转换为dygraphs可以处理的format。这是我使用的代码(notebook here)
html = """
<script src="http://dygraphs.com/dygraph-combined.js"></script>
<div id="dygraph" style="width: 600px; height: 400px;"></div>
<script type="text/javascript">
function convertToDataTable(d) {
var columns = _.keys(d);
columns.splice(columns.indexOf("x"), 1);
var out = [];
for (var k in d['x']) {
var row = [d['x'][k]];
columns.forEach(function(col) {
row.push(d[col][k]);
});
out.push(row);
}
return {data:out, labels:['x'].concat(columns)};
}
function handle_output(out) {
var json = out.content.data['text/plain'];
var data = JSON.parse(eval(json));
var tabular = convertToDataTable(data);
g = new Dygraph(document.getElementById("dygraph"), tabular.data, {
legend: 'always',
labels: tabular.labels
})
}
var kernel = IPython.notebook.kernel;
var callbacks = { 'iopub' : {'output' : handle_output}};
kernel.execute("dfj", callbacks, {silent:false});
</script>
"""
HTML(html)
这就是它的样子:
图表是完全交互式的:您可以使用与典型的dygraph相同的方式悬停,平移,缩放和以其他方式进行交互。
答案 1 :(得分:0)
danvk的解决方案比这更清晰,更快,但我也能够通过从DataFrame构建Dygraph字符串来实现这一点。它似乎限制在大约15K点,但好处是,一旦创建,页面可以保存为静态html页面,Dygraphs图保持不变。为那些没有设置笔记本电脑的人提供了一个很好的便携式共享机制。
CELL:
%%html
<script type="text/javascript" src="http://dygraphs.com/1.0.1/dygraph-combined.js"></script>`
CELL:
import string
import numpy as np
import pandas as pd
from IPython.display import display,Javascript,HTML,display_html,display_javascript,JSON
df = pd.DataFrame(columns=['x','y','z'])x=np.arange(1200)
df.y=np.sin(x*2*np.pi/10) + np.random.rand(len(x))*5
df.z=np.cos(x)
df.x=df.y+df.z/3 + (df.y-df.z)**1.25
s=df.to_csv(index_label="Index",float_format="%5f",index=True)
ss=string.join(['"' + x +'\\n"' for x in s.split('\n')],'+\n')
dygraph_str="""
<html>
<head>
<script type="text/javascript" src="http://dygraphs.com/1.0.1/dygraph-combined.js"> </script>
</head>
<body>
<div id="graphdiv5" style="margin: 0 auto; width:auto;"></div>
<script type="text/javascript">
g = new Dygraph(
document.getElementById("graphdiv5"), // containing div
""" + ss[:-6] + """,
{
legend: 'always',
title: 'FOO vs. BAR',
rollPeriod: 1,
showRoller: true,
errorBars: false,
ylabel: 'Temperature (Stuff)'
}
);
</script>
"""
display(HTML(dygraph_str))
笔记本看起来像这样: