具体例で学ぶ!情報可視化のテクニック

第4回 ツリーマップによる木構造の可視化(後編)

この記事を読むのに必要な時間:およそ 3.5 分

デモプログラムの実行

それではいよいよ,このBinaryTreeMapRendererクラスを使用して,ツリーマップの描画を実践してみましょう。

以下が,ツリーマップを生成し,画像ファイルに出力するDemoクラスになります。このクラスは第2回のDemoクラスと似ていますが,色データが100個に増えていること,階層的クラスタリングの距離関数を最短距離法からWard法に変更していること,そしてクラスタリング結果をコンソールではなくツリーマップに書き出していることが異なります。

Demoクラスでは,OUTPUT_FILE_NAME定数で指定されたファイル名で画像を保存します。定数は,実行環境に応じて適宜書き換えてください。

リスト5 Demo.java

public class Demo {
    // 出力ファイル名
    private static final String OUTPUT_FILE_NAME = "C:/visualization/treemap.png";

    public static void main(String[] args) {
        new Demo().run();
    }

    public void run() {
        List<Item> input = new ArrayList<Item>();
        // ランラムな色データを100個作成
        Random rand = new Random();
        for (int i = 0; i < 100; i++) {
            Color color = new Color(rand.nextFloat(), rand.nextFloat(), rand
                    .nextFloat());
            double area = 0.2 + 0.8 * rand.nextDouble();
            input.add(new ColorItem(color, area));
        }

        // Ward法に基づく階層的クラスタリングを準備
        DistanceEvaluator evaluator = new WardDistanceEvaluator();
        ClusterBuilder builder = new ClusterBuilder(evaluator);

        // クラスタリングを実行
        Node result = builder.build(input);

        // クラスタリング結果を表示
        output(result);
    }

    private void output(Node node) {
        // 400x400ピクセルの画像を作成
        BufferedImage image = new BufferedImage(400, 400,
                BufferedImage.TYPE_INT_RGB);

        // グラフィックオブジェクトを作成
        Graphics2D g = image.createGraphics();

        // 背景を白で塗りつぶす
        g.setPaint(Color.WHITE);
        g.fillRect(0, 0, image.getWidth(), image.getHeight());

        // ツリーマップの描画を実行
        TreeMapRenderer renderer = new BinaryTreeMapRenderer();
        Rectangle2D bounds = new Rectangle2D.Double(20, 20, 360, 360);
        renderer.render(g, node, bounds);

        // 画像をPNGファイルに保存
        try {
            ImageIO.write(image, "png", new File(OUTPUT_FILE_NAME));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Demoクラスを実行すると,図2の画像ファイルが出力されます。まるでステンドグラスのように,美しい画像を作成することができました。このイメージからは,クラスタリングによって似た色同士が階層状に集まっている様子も,大変分かりやすく把握することができます。

図2

図2 treemap

入力データはランダムに生成しているため,出力される画像は実行するたびに異なります。いろいろなパターンの画像が得られますので,イメージをじっくり観察してみてください。

また,以下の観点から考察や実験をしてみると,さらに面白いかもしれません。

  • 入力データの数をさらに増やすと,ツリーマップはどうなるか?
  • 階層的クラスタリングの距離関数をWard法から最短距離法に戻すと,ツリーマップはどうなるか?

まとめと次回予告

今回は,グラフィックスAPIのJava2Dを利用して,ツリーマップをグラフィカルに描画し,画像ファイルに出力するプログラムを作成しました。この実践を通して,ツリーマップが非常に効果的な情報可視化手法であることがお分かりいただけたかと思います。

さて,これまで作成したプログラムの動作確認では,人為的に用意したデータを入力していました。しかし,情報可視化は現実のデータに適用してこそ価値を持つものです。

次回からは,はてなブックマークが提供しているWeb APIを利用し,はてなブックマークのデータを可視化する方法を考えていきます。

著者プロフィール

浜本階生(はまもとかいせい)

1981年生まれ。栃木県出身。東京工業大学情報工学科卒業。技術やアイデアの組み合わせから面白いソフトウェアを生み出したいと日々考えている。現在,ブログの解析および視覚化の試みとして「TopHatenar」「Blogopolis」を開発,運用中。

URLhttp://d.hatena.ne.jp/kaiseh/