項目ごとのデータを図形の大きさで比較
描いた図形の大きさを変えることで、項目ごとのデータを比較してみよう。大きさで表す
リスト2-1は、水生生物の寿命を円の大きさで表しています。 シンプルな例とするため、データの個数は5個で、生物の名前とその平均寿命の年数(さまざまな調査があり、あくまで目安です)をそれぞれ 配列に入れています。const name = ["イカ", "マグロ", "オオサンショウウオ", "ワニ", "シロナガスクジラ"]; const span = [1.0, 20.0, 55.0, 70.0, 100.0];寿命の数値をそのまま円の直径とすると、イカの円の直径は1ピクセルとなり、見えません。つまり、数値データをそのまま使うのではなく、表示のための大きさに適切に変換してやる必要があります。この時、便利なのが map関数です。
平均寿命が一番短いイカのデータ(1年)を表す円の大きさを10(定数minに入れておく)に、一番長いシロナガスクジラ(100年)の円の大きさを120(定数maxに入れておく)とすることを考えます。
let d = map(データの数値, 1, 100, min, max); //円の直径を計算データの数値を円の直径の変換するには、上のように書きます。

【リストT2-1-1】 const name = ["イカ", "マグロ", "オオサンショウウオ", "ワニ", "シロナガスクジラ"]; const span = [1.0, 20.0, 55.0, 70.0, 100.0]; const cx = 80; //最初の円の中心のx座標 const cy = 100; //最初の円の中心のy座標 const max = 120.0; //円の最大直径 const min = 10.0; //円の最小直径 const distance = max+10; function setup() { createCanvas(700, 250); fill(200, 0, 0); noStroke(); textAlign(CENTER, CENTER); //文字を表示する際、中心の座標を指定 } function draw() { background(240); for (let i=0; i<span.length; i++) { let d = map(span[i], 1, 100, min, max); //円の大きさ let x = cx + i*distance; //円を描くx座標 fill(200, 0, 0); ellipse(x, cy, d, d); fill(0); text(name[i], x, cy+max); } }
徐々に大きさを変える
リストT2-1-1を変更し、スケッチが表示されると徐々に円の大きさが増加して、寿命を表す大きさになったら変化を止めるようにしたのがリストT2-1-2です。リストT1-3-1のようにdraw()関数内で描く円の直径を変化させます。この例では、目指す直径になったら増加を止め、円の色を変えています。5つのデータごとに個別に円の大きさを変えるので、円の最終直径と、現在の直径をそれぞれ覚えておく配列を用意します。
let diameter = []; //項目ごとの円の最終直径 let currentD = []; //項目ごとの途中の直径そして、setup()関数の中で、値を初期化します。
for (let i=0; i<span.length; i++) { diameter[i] = map(span[i], 1, 100, min, max); //最終直径を計算 currentD[i] = 0.0; //最初は0 }draw()関数では、データごとに円を描くforループの中で、現在の円の直径にhenka分を加えています。その大きさが最終直径になったら、変数henkaに0を代入し、変化を止め、円の描画色を青に変えます。
クリックで再起動
【リストT2-1-2】 const name = ["イカ", "マグロ", "オオサンショウウオ", "ワニ", "シロナガスクジラ"]; const span = [1.0, 20.0, 55.0, 70.0, 100.0]; let diameter = []; //項目ごとの円の最終直径 let currentD = []; //項目ごとの途中の直径 const cx = 80; //最初の円の中心のx座標 const cy = 100; //最初の円の中心のy座標 const max = 120.0; //円の最大直径 const min = 10.0; //円の最小直径 const distance = max+10; let henka = 1.0; function setup() { createCanvas(700, 250); fill(200, 0, 0); noStroke(); textAlign(CENTER, CENTER); //文字を表示する際、中心の座標を指定 for (let i=0; i<span.length; i++) { diameter[i] = map(span[i], 1, 100, min, max); //最終直径を計算 currentD[i] = 0.0; //最初は0 } frameRate(10); } function draw() { background(240); for (let i=0; i<span.length; i++) { if(currentD[i] >= diameter[i]){ //最終直径になったら henka = 0; //大きさを変えない fill(0, 0, 200); //青にする } else { henka = 1; //そうでないなら1ずつ増やす fill(200, 0, 0); //赤で描く } currentD[i] = currentD[i] + henka; let x = cx + i*distance; //円を描くx座標 ellipse(x, cy, currentD[i], currentD[i]); fill(0); text(name[i], x, cy+max); if (henka == 0) { //増加が終わったら寿命年を表示 text(span[i]+"年", x, cy+max+15); } } }
演習問題

【問題T2-1-2】リストT2-1-2の円を徐々に大きくしたように、問題T2-1-1を変更して、矩形の高さを徐々に高くして、アニメーションさせてみよう。
クリックで再起動