40
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SVGを画像みたいに保存できるD3 Plugin作った

Last updated at Posted at 2014-06-17

D3.jsなどのライブラリの普及によってWebでデータビジュアライゼーションをするということが流行りつつあります。 さて、D3.jsでは主にSVGとして画を描くことになるんですが、書き出されたSVGを簡単に保存して他のドキュメントに貼付けるといった手段がないので困ることがあります。 せっかくSVGで描かれた画をスクリーンショットで保存するのはイマイチですよね。 というわけで、img要素の画像のように右クリックをして保存ができるようなD3 Plugin、d3-downloadableを作ってみました。

インストール

bowerにパッケージを登録してあります。

bower install d3-downloadable

npmも対応しました。(2015/05/12)

使い方

script、cssを読み込んで、svg要素のselectionに対して、downloadable()をcallするだけ。 svg要素を右クリックするとメニューが表示され、SVG、PNG、JPEG形式でダウンロードすることができます。

d3.select('svg#chart')
  .call(downloadable().filename('fig'));

HTML全体はこんな感じ。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" href="bower_components/d3-downloadable/d3-downloadable.css"/>
</head>
<body>
<svg id="fig" width="200" height="200">
  <rect width="200" height="200" x="0" y="0" fill="lightgray"></rect>
  <rect width="150" height="150" x="25" y="25" fill="red" fill-opacity="0.5"></rect>
</svg>
<script src="bower_components/d3/d3.min.js"></script>
<script src="bower_components/d3-downloadable/d3-downloadable.js"></script>
<script>
d3.select('svg#chart')
  .call(downloadable().filename('fig'));
</script>
</body>
</html>

動かすとこんな感じ。
http://jsfiddle.net/likr/rg8Wp/

ダウンロード可能なSVGを書く

これでどんなSVGでも簡単にダウンロードできるようになるのかというと、実はそうでもありません。 D3.jsのサンプルでも、SVGのスタイルをCSSで外部ファイルもしくは、SVGの外のstyle要素に書いている例がよくありますが、d3-downloadableによってSVG部分だけを取り出してきた場合、それらのスタイルが適用されないのでブラウザで見た時と異なる見た目になる場合があります。

なので、SVGをダウンロードできるようにする場合には、可搬性を意識してSVGを書く必要があります。単純なのは、全てのstyleをそれぞれの要素に直接書いてしまうことですが、それが難しいようなら、svg要素の中にdefs要素を作って、その中にstyle要素を書くことができます。

参考

実装にあたってこの辺が参考になりました。

40
37
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?