倭マン's BLOG

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

GroovyChart と戯れて (4) : サンプルコードをもう少し詳しく見てみよう

サンプルも無事に動いてくれたので、次はサンプルコードをもう少し詳しく見てみます。

サンプルコードは前々回に動かしたものを取り上げます(ただし、import 文章略。 また、一部変更しています):

def builder = new ChartBuilder()    // 1. ChartBuilder のインスタンスを生成する
def areachart = builder.xyareachart(    // 2-1. chart ノードの構築
        title:'BMI Index Graph', XAxisLabel: 'weight (Kg)', YAxisLabel: 'height (m)',
        orientation:PlotOrientation.VERTICAL,
        legend:true, tooltips:false, urls:false) {

    xyseries {    // 2-2. dataset ノードの構築
        for(int weight = 0; weight < 150; weight += 10) {
            point('Overweight', x: weight, y: Math.sqrt(weight / 35.0d))
            point('Normal', x: weight, y: Math.sqrt(weight / 25.0d))
            point('Underweight', x: weight, y: Math.sqrt(weight / 18.0d))
        }
    }

    xyplot {    // 2-3. plot ノードの構築
        datasetRenderingOrder(DatasetRenderingOrder.FORWARD)
        foregroundAlpha(1.0f)
        rangeGridlinePaint(Color.BLACK)
        domainGridlinePaint(Color.BLACK)
        domainaxis {
            lowerBound(30)
            upperBound(135)
        }
        rangeaxis {
            lowerBound(0.75d)
        }

        renderer {
            outlinePaint(Color.BLACK)
            outlineStroke(new BasicStroke())
            seriesPaint(0, paint: new Color(0xff, 0, 0))
            seriesPaint(1, paint: new Color(255,255,50))
            seriesPaint(2, paint: new Color(0xff, 0x66, 0x33))
        }
    }
}

def frame = new SwingBuilder().frame(
            title:'This is a Frame', location:[100,100], size:[800,400],
            defaultCloseOperation:WC.EXIT_ON_CLOSE){
    widget(new ChartPanel(areachart.chart))    // 3. JFreeChart オブジェクトを取得する
}

frame.visible = true

大雑把な手順としては以下のようになっているようです:

  1. ChartBuilder のインスタンスを生成する (builder = new ChartBuilder())
  2. 以下の順にチャートを構築する
    1. chart ノード (builder.xyareachart)
    2. dataset ノード (xyseries)
    3. plot ノード (xyplot)
  3. ChartBuilder の構築で得られたオブジェクトから JFreeChart オブジェクトを取得する (areachart.chart)

JFreeChart オブジェクトが得られた後は、「Groovy+JFreeChart」でやったように、ChartPanel を生成して、それを JFrame に埋め込みます。

ノードの順番は大事?


dataset ノード (xyseries) と plot ノード (xyplot) の順番を入れ替えると、データが表示されなくなります(座標は表示されますが)。 plot ノードの子ノードは順番を入れ替えて試してないので分かりません。 ものによっては上書きされたりするかもしれません。

一方、(xyareachart ノードに渡しているtitle, XAxisLabel などの)属性は順番を変えても結果には影響しません(当たり前か)。 JFreeChart では ChartFactory#createXxxxChart() に渡す引数が最初面食らいますが、GroovyChart では順番を気にする必要はありません。 代わりに属性名を指定しないといけないので、コーディング量はちょっと増えますが・・・*1

Groovyイン・アクション

Groovyイン・アクション

*1:いくつかの属性は省略することができるので、一概にコーディング量が増えるとも言えませんが。