node.js - dc.js 与 Node.js 服务器端

标签 node.js d3.js dc.js

我想使用node.js在服务器上渲染dcCharts。我有一个 d3.js 和 node.js 的示例。但我的代码不起作用。我是 Node.js 的初学者,希望你们有一个想法?

d3.js 与 node.js 的代码:example

这是我对 dc.js 和 node.js 的尝试:

var d3 = require('d3')
, dc = require('dc')
, jsdom = require('jsdom')
, fs = require('fs')
, htmlStub = '<html><head></head><body><div id="dataviz-container"></div><script    src="js/d3.v3.min.js"></script></body></html>'

jsdom.env({
features : { QuerySelector : true }
, html : htmlStub
, done : function(errors, window) {
// this callback function pre-renders the dataviz inside the html document, then    export result into a static file

var el = window.document.querySelector('#dataviz-container')
, body = window.document.querySelector('body')

var data = [
    {date: "12/27/2012", http_404: 2, http_200: 190, http_302: 100},
    {date: "12/28/2012", http_404: 2, http_200: 10, http_302: 100},
    {date: "12/29/2012", http_404: 1, http_200: 300, http_302: 200},
    {date: "12/30/2012", http_404: 2, http_200: 90, http_302: 0},
    {date: "12/31/2012", http_404: 2, http_200: 90, http_302: 0},
    {date: "01/01/2013", http_404: 2, http_200: 90, http_302: 0},
    {date: "01/02/2013", http_404: 1, http_200: 10, http_302: 1},
    {date: "01/03/2013", http_404: 2, http_200: 90, http_302: 0},
    {date: "01/04/2013", http_404: 2, http_200: 90, http_302: 0},
    {date: "01/05/2013", http_404: 2, http_200: 90, http_302: 0},
    {date: "01/06/2013", http_404: 2, http_200: 200, http_302: 1},
    {date: "01/07/2013", http_404: 1, http_200: 200, http_302: 100}
    ];

var ndx = crossfilter(data);

var parseDate = d3.time.format("%m/%d/%Y").parse;

data.forEach(function(d) {
d.date = parseDate(d.date);
d.total= d.http_404+d.http_200+d.http_302;
});

var dateDim = ndx.dimension(function(d) {return d.date;});
var hits = dateDim.group().reduceSum(function(d) {return d.total;});

var hitslineChart  = dc.pieChart('dataviz-container');
hitslineChart
.width(500).height(200)
.transitionDuration(500)
.colors(d3.scale.category10())
.radius(90)
.dimension(dateDim)
.group(hits);

dc.renderAll();





// save result in an html file, we could also keep it in memory, or export the       interesting fragment into a database for later use
var svgsrc = window.document.innerHTML
fs.writeFile('index.html', svgsrc, function(err) {
if(err) {
console.log('fehler beim speichern', err)
} else {
console.log('Datei wurde gespeichert!')
}
})  
} // end jsDom done callback
})

我认为 var hitlineChart = dc.pieChart('dataviz-container'); 是错误的。

<小时/>

我改变了我的 htmlStub 和 dc.pieChart:

var hitslineChart  = dc.pieChart('el');

htmlStub = '<html><head></head><body><div id="dataviz-container"></div></script><script type="text/javascript" src="js/d3.js"></script><script type="text/javascript" src="js/crossfilter.js"></script><script type="text/javascript" src="js/dc.js"></script></body></html>'

不幸的是,我仍然收到此错误:

C:\Users\kasse\Code\node-modules\dc\dc.js:2366
    var _colors = d3.scale.category20c();

ReferenceError: d3 is not defined
at Object.dc.colorChart (C:\Users\kasse\Code\node_modules\dc\dc.js:2366:19)
at Object.dc.pieChart (C:\Users\kasse\Code\node_modules\dc\dc.js:2971:31)
at jsdom.env.done (C:\Users\kasse\Code\pre_render.js:44:25)
at C:\Users\kasse\Code\node_modules\jsdom\lib\jsdom.js:255:9
at process._tickCallback (node.js:415:13)
at Function.Module.runMain (module.js:499:11)
at startup (node.js:119:16)
at node.js:902:3

感谢您的帮助。

最佳答案

您需要将 d3 设置为模块内的全局变量:

global.d3 = d3;

... chart rendered here
dc.renderAll();

    var svgsrc = window.document.querySelector('#bubbleChart');
    fs.writeFile('chart.svg', svgsrc.innerHTML, function(err) {
        if (err) {
            console.log('error saving document', err);
        } else {
            console.log('The file was saved!');
        }
    }); 

然后使用 ImageMagick 等命令行工具将 svg 转换为 png。请参阅这篇文章的示例: http://eng.wealthfront.com/2011/12/converting-dynamic-svg-to-png-with.html

关于node.js - dc.js 与 Node.js 服务器端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21483530/

相关文章:

javascript - Node.js:如何从事件监听器返回值?

node.js - Passportjs调用setPassword时this.set不是函数

javascript - Node.js & co - 避免混合 promise 和事件回调

database - 人们使用 Node.js 部署关系数据库更改的方式有哪些?

css - 无论图表内容如何,​​都使 y 轴固定

javascript - 提取一年中一个月的字段数并将其导出为 d3.js 的 json

javascript - 在 R 中,如何在 Sankey Graph 的链接/路径上显示值?

javascript - 使用 dc.js 渲染行图时丢失数据

csv - D3.js - 从 chrome 加载 csv 文件

javascript - dc-js 禁止在单击饼图时选择切片