var d3 = require('d3');
var fabric = require('fabric').fabric;
const {
JSDOM
} = require('jsdom')
const fs = require('fs');
module.exports = async function (context, req) {
var canvas = new fabric.Canvas('test_canvas');
canvas.setWidth(500);
canvas.setHeight(500);
const document = new JSDOM().window.document
datasets = [{
date: "2020-04-01T07:07:14.150Z",
value: 101
},
{
date: "2020-04-01T07:08:24.150Z",
value: 108
},
{
date: "2020-04-01T07:09:34.150Z",
value: 99
},
{
date: "2020-04-01T07:10:44.150Z",
value: 110
},
{
date: "2020-04-01T07:11:54.150Z",
value: 100
},
{
date: "2020-04-01T07:12:14.150Z",
value: 149
},
{
date: "2020-04-01T07:13:24.150Z",
value: 80
},
{
date: "2020-04-01T07:14:34.150Z",
value: 100
},
{
date: "2020-04-01T07:15:44.150Z",
value: 110
},
{
date: "2020-04-01T07:16:54.150Z",
value: 117
},
{
date: "2020-04-01T07:17:14.150Z",
value: 112
},
{
date: "2020-04-01T07:18:24.150Z",
value: 101
},
{
date: "2020-04-01T07:19:34.150Z",
value: 111
},
{
date: "2020-04-01T07:20:44.150Z",
value: 107
},
{
date: "2020-04-01T07:21:54.150Z",
value: 108
},
]
var w = 400; // 幅 (マージン部分は除く)
var h = 300; // 高さ (マージン部分は除く)
var margin = {
left: 50,
top: 20,
bottom: 50,
right: 20
};
// x軸の目盛りの表示フォーマット
let format = d3.timeFormat("%H:%M");
datasets = datasets.map(function (d) {
let timeparser = d3.timeParse("%Y-%m-%dT%H:%M:%S.%LZ");
// 日付のデータをパース
return {
date: timeparser(d.date),
value: d.value
};
});
// (a) svg 要素の追加
var g = d3.select(document.body).append('svg')
.attr('xmlns', 'http://www.w3.org/2000/svg')
.attr('width', w + margin.left + margin.right) // svg 要素の幅
.attr('height', h + margin.top + margin.bottom) // svg 要素の高さ
.append('g')
.attr('fill', 'none')
.attr('transform', `translate(${margin.left}, ${margin.top})`);
// (b) スケールの定義
var x = d3.scaleTime()
// 最小値と最大値を指定しX軸の領域を設定する
.domain([
// データ内の日付の最小値を取得
d3.min(datasets, function (d) {
return d.date;
}),
// データ内の日付の最大値を取得
d3.max(datasets, function (d) {
return d.date;
})
])
.range([0, w]);
var y = d3.scaleLinear().range([0, h]).domain([
// 0を最小値として設定
// データ内のvalueの最大値を取得
d3.max(datasets, function (d) {
return d.value;
}),
0
]);
// (c) 軸の定義
let xTicks = 6;
var xAxis = d3.axisBottom(x)
// グラフの目盛りの数を設定
.ticks(xTicks)
// 目盛りの表示フォーマットを設定
.tickFormat(format);
var yAxis = d3.axisLeft(y)
.tickSize(0)
.tickFormat(function (d) {
if (d < 1000) return d;
else return d / 1000 + "K"
});
// (d1) 横軸の追加
g.append('g')
.attr('transform', `translate(0, ${h})`)
.call(xAxis)
// (d2) 縦軸の追加
g.append('g')
.call(yAxis)
.append('text') // 縦軸のラベル
.attr('transform', 'rotate(-90)')
// 折れ線の作成関数
var createLine = d3.line()
// lineのX軸をセット
.x(function (d) {
return x(d.date);
})
// lineのY軸をセット
.y(function (d) {
return y(d.value);
})
// カーブを設定
.curve(d3.curveCatmullRom.alpha(0.4));
// (e) 折れ線の追加
g.append('path')
.attr('d', createLine(datasets))
.attr('stroke', 'rgb(133, 167, 204)')
.attr('fill', 'rgb(133, 167, 204)')
.attr("stroke-dashoffset", 0)
.attr("stroke-dasharray", 0)
.attr('stroke-width', '2')
.datum(datasets);
var svg_t = document.body.innerHTML;
fabric.loadSVGFromString(svg_t, function (objects, options) {
var obj, stream;
obj = fabric.util.groupSVGElements(objects, options);
canvas.add(obj).renderAll();
stream = canvas.createPNGStream();
const dest = fs.createWriteStream(
__dirname + "/dest.png"
);
let buffs =[];
stream.on('data', function (chunk) {
buffs.push(chunk);
dest.write(chunk);
});
stream.on('end', function () {
dest.end()
context.res = {
status: 200,
body: Buffer.concat(buffs),
"headers": {
"Content-Type": "image/png"
}
};
});
});
};