2.読み込みんだデータをグラフにする
前回の記事では、データを作成しグラフを表示するには次のようなコードを記述しました。
{LayeredChart
width = 15cm
, height = 7.25cm
, left-axis = {new {NumericDataSeriesAxis-of float}
, {ChartDataSeries records, "height"}
, force-zero? = false
, force-range? = true
, forced-min = 130
, forced-max = 210
}
, {BubbleLayer
records
, "height"
, scatter-shape = "ellipse"
, x-axis-data = {ChartDataSeries records, "name"}
, primary-size-data = {ChartDataSeries records, "bmi"}
, secondary-size-data = {ChartDataSeries records, "bmi"}
}
}
上記コードのrecordsという変数は、RecordSetのインスタンスです。一方、CSVファイルデータを読み込んだデータを表すCsvRecordSetクラスはRecordSetを継承しているため、上記とまったく同じコードを記述するだけで対応できます。recordsという変数の位置にCsvRecordSetのインスタンスを渡せばグラフ化が可能です。
Javaなどでは、CSVファイルを扱うモジュールとグラフ化を行うモジュールが、異なるモジュールであるのが一般的なため、その間には型変換を行う処理が必要になってきます。しかし、Curlの場合、統一されたAPIとして提供されているので、スマートにデータの連携が行えます。
しかし、これだけのコードでは、CSVのデータにBMI値が含まれていないためエラーになってしまいますので、BMI値を計算し設定する必要があります。CsvRecordSetのインスタンスにBMI値を設定するコードは次のようになります。
{for record:Record in records do
set record["bmi"] = record["weight"]/((record["height"]/100)*(record["height"]/100))
}
これは、全レコードに対して、体重と身長からBMI値を計算し、設定するというコードです。RecordSetクラスは、JavaのMapのように、キーを指定してアクセスできます。
コード全体は次のようになります。
{curl 6.0 applet}
{curl-file-attributes character-encoding = "shift-jis"}
{import * from CURL.GUI.CHARTS}
{let records:CsvRecordSet =
{CsvRecordSet
{url "data.csv"}
|| ヘッダが存在する場合は、ヘッダの行数を指定する
, header-line-count = 1
, fields =
{RecordFields
{RecordField "name", caption = "Name", domain = String}
, {RecordField "height", caption = "height", domain = int}
, {RecordField "weight", caption = "weight", domain = int}
, {RecordField "bmi", caption = "bmi", domain = int}
}
}
}
|| BMIの計算と値の設定
{for record:Record in records do
set record["bmi"] = record["weight"]/((record["height"]/100)*(record["height"]/100))
}
{LayeredChart
width = 15cm
, height = 7.25cm
, left-axis = {new {NumericDataSeriesAxis-of float}
, {ChartDataSeries records, "height"}
, force-zero? = false
, force-range? = true
, forced-min = 130
, forced-max = 210
}
, {BubbleLayer
records
, "height"
, scatter-shape = "ellipse"
, x-axis-data = {ChartDataSeries records, "name"}
, primary-size-data = {ChartDataSeries records, "bmi"}
, secondary-size-data = {ChartDataSeries records, "bmi"}
}
}


