かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

TypeScriptとd3.js

グラフ描きたい・・・!Webで(詰んだ)

  • HTML苦手
  • CSS苦手
  • JavaScript苦手

d3.js

苦手といっても何か使えるものはないか?ということで、探してみたのがd3.js。こいつjQueryみたいなセレクタで要素を選択したりもできるし、グラフ描いたりもできるとは…。素敵だ。

TypeScript

言わずと知れた、C#の父のアンダーズ・ヘルズバーグが開発してるaltJSシリーズの言語。こいつなら・・・!と思って以下のページを流し読みして書いてみたらとてもいい!なじむ!

module Hoge {
    export class Foo {
        constructor(public x: number, public y: number) {}
        hoge(callback: (result: number) => void): void {}
    }
}

みたいな感じで書けるじゃないですか。素敵。しかもCtrl + Spaceも効く。JavaScriptのライブラリも追加の型の定義を書いてやれば普通に使える・・・!いいね!

とりあえず

使わなきゃいけない内部のJavaScriptライブラリのd.tsファイルを作った。Ctrl + Spaceで補完効くようになったのでストレスが1つ減った。

d3.js

このライブラリは、チュートリアルが秀逸なので、やりたいと思った人はここからスタートするといいと思います。

事例集を見てると、これをWebでやってるのか!?変態(ほめ言葉)と思うようなのばっかりなのですが…。

TypeScriptで使う

Visual Studio 2013用のTypeScriptの最新版を入れます。現時点では9.5。早く1.0欲しいですね~。

そしてTypeScriptのプロジェクトを作って以下の2つをNuGetでインストール。型定義がきちんとあるのはメジャーなライブラリの強みですね。

お試し

app.tsを以下のような感じにしてみた。0~100の値を0~50の間に収まるように変換して画面にdivタグを使って表示してます。(グラフのスケーリングで、この値の変換使う)

window.onload = () => {
    var r = d3.scale.linear().domain([0, 100]).range([0, 50]);
    d3.select("body")
        .selectAll("datas")
        .data([0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100])
        .enter()
        .append("div")
        .text(d => JSON.stringify({ original: d, scaled: r(d) }));
};

HTMLは、こんな感じ。

<!DOCTYPE html>

<html lang="ja">
<head>
    <meta charset="utf-8" />
    <title>TypeScript HTML App</title>
    <link rel="stylesheet" href="app.css" type="text/css" />
    <script src="Scripts/d3.v3.min.js"></script>
    <script src="app.js"></script>
</head>
<body>
</body>
</html>

実行結果のHTMLは以下のような感じになりました。

<html lang="ja"><head>
    <meta charset="utf-8">
    <title>TypeScript HTML App</title>
    <link href="app.css" rel="stylesheet" type="text/css">
    <script src="Scripts/d3.v3.min.js"></script>
    <script src="app.js"></script>
</head>
<body>

  <div>{"original":0,"scaled":0}</div><div>{"original":10,"scaled":5}</div>
  <div>{"original":20,"scaled":10}</div><div>{"original":30,"scaled":15}</div>
  <div>{"original":40,"scaled":20}</div><div>{"original":50,"scaled":25}</div>
  <div>{"original":60,"scaled":30}</div><div>{"original":70,"scaled":35}</div>
  <div>{"original":80,"scaled":40}</div><div>{"original":90,"scaled":45}</div>
  <div>{"original":100,"scaled":50}</div>
</body>
</html>

いい感じ。グラフとか描けるように使ってみよう。