現在、私はPhDを始めており、ネットワークグラフを作成する必要がある友人のための小さなアプリケーションを作成しています。これまでのところ、Force Directedグラフを使用するとすべてが正常に機能します。グラフノードを移動して、レイアウトのスタイルを設定できます。
頭が動かないのは:
"キャンバスからデータを抽出してSVGファイルに保存する方法"。
私はすでにコンソールから画像データにアクセスしようとしました
var app.canvas = document.getElementById( 'graph-canvas' )
.getContext( '2d' )
.getImageData( 0, 0, 200, 200 );
代わりに(object) ImageData
を受け取りました。これで、↑のキャンバスデータにapp.canvas.data
でアクセスできるようになりました。 (値を調べすぎると、ブラウザがハングし始め、スクリプトを停止するかどうかを尋ねます-Chrome&FF latest)。
ここからSVGを描画し、ボタンをクリックして保存するにはどうすればよいですか?
編集:
これまでのところ、SVGを描画してimage/png
要素を追加する方法を見つけました。ただし、表示されません。
// Add the test SVG el:
var svg = document.createElementNS( "http://www.w3.org/2000/svg", "svg" );
svg.setAttribute( 'style', 'border: 1px solid black;' )
.setAttribute( 'width', '600' )
.setAttribute( 'height', '400' )
.setAttributeNS(
'http://www.w3.org/2000/xmlns/',
'xmlns:xlink',
'http://www.w3.org/1999/xlink'
);
// Call
importCanvas( document.getElementById( 'infovis-canvas' ), svg );
// Function: Add data to SVG
function importCanvas( sourceCanvas, targetSVG )
{
// get base64 encoded png data url from Canvas
var img_dataurl = sourceCanvas.toDataURL( "image/png" );
var svg_img = document.createElementNS(
"http://www.w3.org/2000/svg",
"image"
);
svg_img.setAttributeNS(
'http://www.w3.org/1999/xlink',
'xlink:href',
img_dataurl
);
jQuery( targetSVG.appendChild( svg_img ) )
.appendTo( '#graph-container' );
console.log( 'done' ); // Log & confirm
}
そして最後に...
// ...resulting SVG element containing the image element
<svg style="border: 1px solid black;" width="600" height="400" xlink="http://www.w3.org/1999/xlink"><image href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAA(...)
UIはjQuery UI、jQuery、および The Jit/InfoVIZ ライブラリで動作するため、これらを使用できます。
ラスタではなくベクターグラフィックとして保存する場合は、キャンバスAPIの操作をsvgに変換するライブラリの1つを試すことができます。
SVGKit :の場合
var svgkitContext = new SVGCanvas(150,150);
function draw(ctx) {
// ... normal canvas drawing commands go here ...
}
// draw to SVGKit canvas (svg) instead of canvasElement.getContext("2d")
draw(svgkitContext);
上記のフル実行 例 。
canvas-svg :の場合
var canvasSVGContext = new CanvasSVG.Deferred();
canvasSVGContext.wrapCanvas(document.querySelector("canvas"));
var canvasContext = document.querySelector("canvas").getContext("2d");
function draw(ctx) {
// ... normal canvas drawing commands go here ...
}
// draw to html5 canvas and record as svg at the same time
draw(canvasContext);
// append the svg result
var svg = document.appendChild(canvasContext.getSVG());
上記のフル実行 例 。
代わりにsvgを生成する場合:
もちろん、もう1つのオプションは、最初にsvgとしてグラフを作成することです。 d3.js は、これを簡単に実行できるJavaScriptライブラリです。例 この例 を参照してください力有向グラフの。