使用最新 D3 版本从 node.js 生成 PNG 的最佳方法?

Best way to use recent D3 versions to produce PNGs from node.js?

我想使用 d3 服务器端直接或通过 SVG 创建 PNG 文件。 我可以在这里找到许多关于如何实现这一点的讨论,但它们都是很多年前的,指的是 d3 v3 或 v4,node 回到 v10。 是否仍然有必要假装我们在浏览器中,使用 jsdom 之类的东西提供伪 DOM? 替代的 d3-node 系列软件包实际上仍然有效吗?他们大多已经好几年没有更新了。

这是我在 macOS 11.6 上的节点 17.0.1、d3 7.1.1、d3-node 2.2.3 上的 MNWE:

const fs = require('fs');
const d3 = require('d3-node')().d3;
const output = require('d3node-output');
const d3nBar = require('d3node-barchart');
// const d3nPie = require('d3node-piechart');
// const csvString = fs.readFileSync('mentions.csv').toString();
const csvString=`key,value
Bob,33
Robin,12
...
Stacy,20
Charles,13
Mary,29`
const csvData = d3.csvParse(csvString);

const selector = `#chart`
const container = `<div id="container"><h2>Bar Chart</h2><div id="chart"></div></div>`
const style = `.bar{fill: steelblue;}
.bar:hover{fill: brown;}
.axis{font: 10px sans-serif;}
.axis path,.axis line{fill: none;stroke: #000;shape-rendering: crispEdges;}
.x.axis path{display: none;}`

// create output files
// const pie = d3nPie(csvData, selector, container, style)
const bar = d3nBar(csvData, selector, container, style)
output('output', bar);

我在 d3node-barchart 库中出现的倒数第二行出现以下错误:

/Users/j/Dropbox/NP-other-tests/node_modules/d3node-barchart/index.js:55
  x.domain(data.map((d) => d.key));
                ^

TypeError: Cannot read properties of undefined (reading 'map')
    at bar (/Users/j/Dropbox/NP-other-tests/node_modules/d3node-barchart/index.js:55:17)
    at Object.<anonymous> (/Users/j/Dropbox/NP-other-tests/d3test.cjs:45:13)
    at Module._compile (node:internal/modules/cjs/loader:1095:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1147:10)
    at Module.load (node:internal/modules/cjs/loader:975:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:17:47

调查

错误消息表明 d3n-barchart 未找到 data 它期望的位置。

查看抛出错误的文件:node_modules/d3node-barchart/index.js,似乎函数 bar 需要一个对象作为参数,而不是数据数组作为第一个参数。

function bar({
  data,
  selector: _selector = '#chart',
  ...

看来 README of d3n-bar 中显示的语法不正确。

如库的example file所示,d3nBar函数以一个对象为入参,data 属性.

解决方案

应用 d3n-barchart 示例文件中的语法解决了错误:

const bar = d3nBar({
    data: csvData
    , selector: selector
    , container: container
    , style: style
})

您可能想要更正 d3n-barchart 的 README 文件并提交拉取请求,以帮助未来的用户获得正确的代码:)