倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

GroovyChart と戯れて (7) : データとビューを分離する

ChartBuilder はデータ (dataset) とチャートの表示設定をビルダーで構築できるライブラリで、今まで見てきたサンプルでは、データと表示設定を1回のビルダー構築で行っていました。 ただし、この方法では、データ構造や表示設定のカスタマイズが複雑になってくるとチョット書くのが面倒になってしまうし、MVC モデルを採用しようとしたときにモデルとビューの分離ができなくなりそうです。

そこで、今回はデータを別途用意して、ChartBuilder にはビューの構築のみをさせる方法を見ていきます。

データの生成


今回はデータを別途用意するので、「Groovy+JFreeChart」でやったように Dataset オブジェクト(ここでは XYSeriesCollection オブジェクト)を生成します。

def dataset = new XYSeriesCollection()
dataset.with{
    addSeries(new XYSeries('Overweight'))
    addSeries(new XYSeries('Normal'))
    addSeries(new XYSeries('Underweight'))
    for(int weight = 0; weight < 150; weight += 10) {
        getSeries('Overweight').add(weight, Math.sqrt(weight / 35.0d))
        getSeries('Normal').add(weight, Math.sqrt(weight / 25.0d))
        getSeries('Underweight').add(weight, Math.sqrt(weight / 18.0d))
    }
}

もっとスマートに生成する方法があるかも知れませんが、まぁ、今回の話の本筋とは関係ないので(dataset の構築は次回以降に)。

外部データからチャートを生成する


では、(ChartBuilder の)外部で作成したデータを ChartBuilder に渡す方法を見ていきましょう。

以前の記事」で、ChartBuilder では chart ノード(今までのサンプルでは xyareachart)に渡す属性は JFreeChart の ChartFactory#createXxxxChart() メソッドに渡す引数になってそうだということを見ましたが、そのメソッドにはデータ (dataset) も渡す必要があったので、逆に chart ノードの属性にデータを渡せるのではないかと期待できます。 実際にdataset というキーで Dataset オブジェクトを渡してみると

def chart = builder.xyareachart(
        title:'BMI Index Graph', XAxisLabel: 'weight (Kg)', YAxisLabel: 'height (m)',
        dataset:dataset,
        orientation:PlotOrientation.VERTICAL) {

    xyplot {
        foregroundAlpha(1.0f)
    }
}

ばっちりチャートが表示されます! 期待したことが期待通りに動くライブラリってしびれるぅ!

Groovyイン・アクション

Groovyイン・アクション