倭算数理研究所

科学・数学・学習関連の記事を、「倭マン日記」とは別に書いていくのだ!

続・シミュレーション結果をチャートで出力

前回、シミュレーション結果をチャートにして画像ファイルとして出力する方法を見ました。 今回は引き続き、チャート関連の話。

今回はシミュレーション結果自体ではなく、それと比べる他のデータをチャートに付加する方法を見ていきます。 具体的には

  • x 軸、y 軸に平行な直線(マーカー)の描画
  • 関数指定による曲線の描画
  • 外部データのプロット

を見てきます。 すべて marker ノードによって指定し、label 属性で(凡例などの)名前を設定します。

x 軸、y 軸に平行な直線の描画


まずは x 軸や y 軸に平行な直線。 JFreeChart でマーカーと言われるのはこの直線です。 x 軸、y 軸に平行な直線は、それぞれ y 属性x 属性を指定します:

import java.awt.Color

new SimulationBuilder().simulation{
    ...
    png(fileName:'marker.png', overwrite:true){
        chart(title:'Time-Temperature Chart', domainLabel:'Time', rangeLabel:'Temperature'){
            point(label:'T', x:'time', y:'T')
            marker(label:'time = 1', x:1d, color:Color.GREEN)
            marker(label:'T = 30', y:30d, color:Color.BLUE)
        }
    }
}

このコードで、marker ノードはそれぞれ「x = 1」、「y = 30」の直線(今の場合は「time = 1」、「T = 30」 )を描画します。 色の指定は color 属性java.awt.Color オブジェクトを設定しています。 AWT なら paint 属性の方がいいのかも知れませんが、それは今後の課題にってことで。 チャートを描画すると下図のようになります:

f:id:waman:20110625142521p:image

関数指定による曲線の描画


次は関数の指定。 JFreeChart では関数の描画は Function2D インターフェースを使用しますが(こちらを参考のこと)、Groops では Groovy のクロージャを使うのが自然でしょう:

new SimulationBuilder().simulation{
    ...
    png(fileName:'function.png', overwrite:true){
        chart(title:'Time-Temperature Chart', domainLabel:'Time', rangeLabel:'Temperature'){
            point(label:'Simulation', x:'time', y:'T')
            marker(label:'Exact Solution', 
                       function:{ double t -> 17d - (17d - 82.3d)*Math.exp(-t) },
                       samples:1000)
        }
    }
}

function 属性に、関数に対応するクロージャを渡しています。 また、サンプリングの個数を samples 属性によって指定しています。 samples 属性がなければデフォルト値が使われます(今のところ1000)。 チャートを描画するとこんな感じ:

f:id:waman:20110625142520p:image

外部データのプロット


最後は、実験データなどの外部データをプロットする方法。 シミュレーションを実行するフォルダ上に以下のような data.csv ファイル(comma-separated value, コンマで区切られたデータ)があるとしましょう:

# data.csv
0,0.0,82.3
1,0.1,64.6037
2,0.2,45.109508813
3,0.30000000000000004,59.84333
4,0.4,75.77
5,0.5,42.298557931699996
6,0.6,48.23278757
7,0.7,51.7030973
8,0.7999999999999999,69.893
9,0.8999999999999999,55.558997000000005
10,0.9999999999999999,39.768702138529996

このとき、以下のように fileName 属性によってファイル名を指定すれば、データを点としてプロットできます:

new SimulationBuilder().simulation{
    ...
    png(fileName:'file.png', overwrite:true){
        chart(title:'Time-Temperature Chart'){
            point(label:'Simulation', x:'time', y:'T')
            marker(label:'Experiment Data', fileName:'data.csv', x:1, y:2)
        }
    }
}

x 属性y 属性はデータの何行目のデータを使うかを指定しています。 これらの指定がなければ、デフォルトで x に0、y に1が指定されているものと見なされます。 チャートを描画すると下図のようになります:

f:id:waman:20110625151314p:image

計算物理学入門

計算物理学入門

  • 作者: ハーベイゴールド,ジャントボチニク,Harvey Gould,Jan Tobochnik,鈴木増雄,石川正勝,溜渕継博,宮島佐介
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2000/12
  • メディア: 単行本
  • クリック: 5回
  • この商品を含むブログ (45件) を見る