D3.js SVGの使い方 - rect, circle, line, text

SVG図形、SVG要素のスタイル、描画順序、透明度、D3でSVGを描画する方法

概要

D3.jsはHTML要素を使用して表示できるが、SVGを使用するとブラウザやデバイスの違いに影響されにくく、より高速に応答するサイトを作成できる。

SVG(Scalable Vector Graphics)

  • Web用のベクターグラフィック。HTML文書に直接含めたり挿入したりできる。
  • Internet Explorer 8以下を除くすべてのブラウザでサポートされている。
  • コードで画像を編集できる。
  • 品質を損なわずに拡大・縮小できる。

簡単なSVGの使い方

ここでは簡単なSVGの使い方を説明する。

SVGを表示するには、まずSVG要素を描画する領域を作成する必要がある。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>D3 Test</title>
    <script src="https://d3js.org/d3.v7.min.js"></script>
  </head>
  <body>
    <svg width="500" height="50">
    </svg>
    <script>
      // ここにコードを記述する。
    </script>
  </body>
</html>

D3を使用して次のように記述してもよい。

d3.select("body").append("svg").attr("width", 500).attr("height", 50);

ここでは幅と高さを設定することが重要である。設定しない場合、可能な限り大きな領域が設定される。

SVG図形

SVG要素内に設定できる代表的な図形を見ていく。rectcircleellipselinetextpathなど、さまざまなものがある。

座標は画面左上が原点(0, 0)となり、右へ進むほどx座標が増え、下へ進むほどy座標が増える。
(x, y)の基準は左上から

0,0 100,20 200,40
<svg width="500" height="70">
  • width: 横の長さ
  • height: 縦の長さ

また、タグの終わりを/>で閉じることが重要である。

<rect></rect>

上のように書いてもよいが、Text以外のSVG要素は単独で使うことが多いため、次のように後ろのタグを省略できる。

<rect/>

rect

rectは四角形を描画する要素である。x、y座標および幅、高さを設定する。

<rect x="10" y="10" width="500" height="50" rx="10" ry="10"/>
  • x: 四角形の横方向の開始点
  • y: 四角形の縦方向の開始点
  • width: 横の長さ
  • height: 縦の長さ
  • rx: 横方向の角丸の度合い
  • ry: 縦方向の角丸の度合い

circle

circleは円を描画する要素である。x、y座標および半径を設定する。

<circle cx="250" cy="25" r="25"/>

line

lineは線を描画する要素である。始点座標、終点座標、および色を設定する。色を設定しない場合は透明になる。

<line x1="0" y1="0" x2="500" y2="50" stroke="black"/>

text

textは文字列を描画する要素である。座標を設定し、タグ内に表示するテキストを記述する。

<text x="250" y="25">Text</text>
Text

矢印

次の例は、線の終端に図形を付けて矢印線を表現したコードである。

<svg>
  <defs>
    <marker id="Triangle" viewBox="0 0 10 10" refX="1" refY="5"
        markerWidth="6" markerHeight="6" orient="auto">
      <path d="M 0 0 L 10 5 L 0 10 z" />
    </marker>
  </defs>
  <polyline points="10,10 200,50" fill="none" stroke="black" stroke-width="2" marker-end="url(#Triangle)" />
</svg>

コードを見ると、SVGの機能のうちmarker定義を利用している。図形をあらかじめ定義して再利用する方式である。
markerのorientautoに指定すると線の傾きに合わせて自動的に回転でき、回転時の原点を指定するためにrefXrefYの値を使用する。

SVG要素のスタイル

SVGで設定できる代表的なスタイル(属性)は次のとおりである。

属性 説明
fill 塗りつぶしの色値。CSSと同じように次の4種類で指定できる。
  • 色名 - 例: “orange”
  • 16進数 - 例: #3388aa
  • RGB - 例: rgb(10, 150, 20)
  • RGB+α - 例: rgba(10, 150, 20, 0.5)
stroke 枠線の色値
stroke-width 枠線の太さ。数値。
opacity 透明度。0.0から1.0の値。
font-family textのみ。フォント。
font-size textのみ。フォントサイズ。

これらのスタイルを使用して、次のように装飾できる。

<circle cx="25" cy="25" r="22" fill="yellow" stroke="orange" stroke-width="5"/>

描画順序

SVGにはCSSのz-indexのような概念はなく、後から設定されたものが上書きされる形で表示される。

たとえば、次のような重なったSVGを描画すると、下のようになる。

<rect x="0" y="0" width="30" height="30" fill="purple"/>
<rect x="20" y="5" width="30" height="30" fill="blue"/>
<rect x="40" y="10" width="30" height="30" fill="green"/>
<rect x="60" y="15" width="30" height="30" fill="yellow"/>
<rect x="80" y="20" width="30" height="30" fill="red"/>

重要なのは、後から記述されたものが上に表示されるということである。

透明度

重なった要素をすべて表示するには、透明度を設定できる。全体の透明度を設定したい場合はopacityを使用し、枠線と塗りつぶしをそれぞれ別の透明度にしたい場合などはrgbaを使用する。

次の例では透明度をいくつか変えて表現している。

<circle cx="25" cy="25" r="20" fill="rgba(128, 0, 128, 1.0)"/>
<circle cx="50" cy="25" r="20" fill="rgba(0, 0, 255, 0.75)"/>
<circle cx="75" cy="25" r="20" fill="rgba(0, 255, 0, 0.5)"/>
<circle cx="100" cy="25" r="20" fill="rgba(255, 255, 0, 0.25)"/>
<circle cx="125" cy="25" r="20" fill="rgba(255, 0, 0, 0.1)"/>

D3でSVGを描画する

D3を使用してSVG要素を追加するには、次のように記述する。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>D3 Test</title>
    <script src="https://d3js.org/d3.v7.min.js"></script>
  </head>
  <body>
    <script>
      // ここにコードを記述する。
      var svg = d3.select("body").append("svg").attr("width", 500).attr("height", 100);
      var dataset = [1, 2, 3, 4, 5];
      var circles = svg.selectAll("circle")
        .data(dataset)
        .enter()
        .append("circle");
      circles.attr("cx", function(d, i) {
        return (i * 50) + 25;
      })
      .attr("cy", 50)
      .attr("r", function(d) {
        return 5*d;
      })
      .attr("fill", "yellow")
      .attr("stroke", "orange")
      .attr("stroke-width", function(d) {
        return d;
      });
    </script>
  </body>
</html>

コードを実行

属性は1つずつattrで指定する必要がある。v3まではオブジェクトで設定できたが、v4以降はできない。