K4750.NET

SVG Recipe

SVGのサンプルページ「SVG Recipe(SVGレシピ)」について。

D3.js(Data-Driven Documents)を使うための基礎知識であるSVG(Scalable Vector Graphics)で遊んだ軌跡を「SVG Recipe」に残すこととした。

目的はSVGで遊ぶ過程で得た様々な記述方法等を記録し、レシピのようにして参照できる状態にしておくことにある。公開時点では基本図形のサンプルが一つだけであるが、今後少しずつ増やしていき、年内(2013年内)にはSVGの各要素・属性のサンプルを一巡したいと思う。


1.参考

本家のリファレンスの他にも、サンプルの充実したサイトが世には沢山ある。感謝。


2.その他

「SVG Recipe」作成にあたり、WordPressのカスタム投稿/カスタム分類(とそのためのテンプレート)、ショートコードに初めて触れた。また、「SVG Recipe」のトップページは、可変グリッドレイアウトを実現するためにMasonry(JavaScript grid layout library)を使っている。躓いた点、有用と思われる情報については追々本サイトで触れていきたい。

サーバーサイドD3(Yet another)

サーバーサイドでD3.jsを使うにあたり「GUNMA GIS GEEK」を参考にさせて頂いたが、簡単ではなかったので本サイトなりに注意点等をまとめてみる。

なお、サーバーサイドでD3.jsを使う(本サイトの)目的は、WEBサーバー(Ubuntu 12.04.3 LTS)にてNode.js+D3.jsを使用してSVGファイルを生成し、そのファイルをブラウザのIMG要素にて参照・表示させることにある。


1.準備

まず、Node.jsおよびD3.jsの現時点の最新版をサーバにインストールする。詳細は過去の投稿を参照。概要は以下のとおり。

  1. node-v0.10.18.tar.gzのビルド・インストール(パッケージ版はバージョンが古いため)
  2. npmコマンドにてD3.jsをインストール(-g(Global install)付き)
  3. サンプルコードを実行(NODE_PATH環境変数を設定)

また、svgファイルを置く予定のWEBサイトの.htaccessファイル等に以下を追記しておく。

AddType image/svg+xml .svg

2.ひな形

サーバーサイドで実行する.jsファイルのひな形(JSONファイルを読み込んで、SVGファイルを出力する)の構成は以下のようになる。

var d3 = require("d3");

/* サイズ(650×250)やマージンを定義する */
var margin = {top: 20, right: 80, bottom: 30, left: 50},
    width = 650 - margin.left - margin.right,
    height = 250 - margin.top - margin.bottom;

/* svgタグを生成する */
var svg = d3.select("body")
    .append("svg")
      .attr("width", width + margin.left + margin.right)
      .attr("height", height + margin.top + margin.bottom)
      .attr("version", "1.1")
      .attr("xmlns", "http://www.w3.org/2000/svg");

/* CSSを記述するためのstyleタグを生成する */
svg
  .append("defs")
    .append("style")
      .attr("type", "text/css")
      .text("..."); // ここにCSSの内容を記述する。

/* JSONファイルを読み込む */
var data = require('./data.json');

/* dataを元に、svg変数に様々な操作等を行い、SVGデータを生成する */
...

/* SVGファイルのお約束(?)を出力する */
console.log('<?xml version="1.0" standalone="no"?>');
console.log('<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">');

/* SVG要素を出力する */
console.log(d3.select("body").node().innerHTML);

SVGとCSSとの関連付けについては、上記の方法(defs/styleタグを使用する)の他に、「外部ファイル化する」方法と「個々の要素にstyle属性を都度記述する」方法がある。詳細はこのあたり日本語)を参照。


3.サンプルコード

sysstatで収集したCPU使用率のデータから折れ線グラフを生成するD3.jsのサンプルコードを以下に示す。なお、本サンプルは、D3.js本家のGalleryにある「Multi-Series Line Chart」を参考にしている。


4.実行結果

jsonファイルとjsファイルを同じディレクトリに格納し、nodeコマンドを実行する。

$ NODE_PATH=/usr/local/lib/node_modules node sar-u2svg.js > sar-u.svg

生成されたSVGファイルをIMGタグで表示すると以下となる。

%idle平均99.62だからね。。(´・ω・`)

Node.jsビルド&D3.jsインストール

npm(node package manager)にてD3(Data-Driven Documents)をインストールする!

npm README.html:
You need node v0.8 or higher to run this program.

(´・ω・`)


1.Node.jsビルド&インストール

先ほどインストールしたパッケージ版(v0.6.12)を削除する。

# apt-get purge nodejs

最新版(v0.10.18)をダウンロードする。

$ wget http://nodejs.org/dist/v0.10.18/node-v0.10.18.tar.gz
$ tar xvfz node-v0.10.18.tar.gz
$ cd node-v0.10.18/
$ cat README.md
...
Prerequisites (Unix only):

    * GCC 4.2 or newer
    * Python 2.6 or 2.7
    * GNU Make 3.81 or newer
    * libexecinfo (FreeBSD and OpenBSD only)
...

足りないものはない。ビルド&インストール。

$ ./configure
$ make
$ sudo make install
...
$ which node
/usr/local/bin/node
$ node -v
v0.10.18

2.D3.jsインストール

$ sudo npm install -g d3

3.D3.jsでHello World

hwd3.js:

var d3 = require("d3");
var svg = d3.select("body")
  .append("svg")
  .attr({
    xmlns: "http://www.w3.org/2000/svg",
    width: 200,
    height: 25
  });
svg.append("text")
  .attr({
    x: 10,
    y: 20,
    "font-size": 24
  })
  .text("Hello D3 World");
console.log(d3.select("body").node().innerHTML);

nodeコマンドを実行する。

$ export NODE_PATH=/usr/local/lib/node_modules
$ node hwd3.js
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="25"><text x="10" y="20" font-size="24">Hello D3 World</text></svg>