データを位置で表す
演習問題T3-1-2では、円を任意に決めた垂直位置で止めましたが、データの値を反映した位置を計算する必要があります。上に伸びる値
Global Entrepreneurship Monitor(GEM)に基づいたTotal early-stage Entrepreneurial Activity (TEA, 新しいビジネスを起業した18から64歳の人口割合)を The World Bankが公開 しています。 これを基に、10ヵ国のデータを比較したスケッチを作成してみます(2019年のデータ)。クリックで再起動
Datamateのテーブルを作るmake()関数は次のようになります。
Datamate.make("国", ["Italy", "Japan", "Germany", "Norway", "China", "Australia", "Korea", "India", "USA", "Brazil"]); Datamate.make("企業活動指数", [2.8, 5.4, 7.6, 8.4, 8.7, 10.5, 14.9, 15.0, 17.4, 23.3]);キャンバスを10のエリアに分割し、それぞれに国名、円、データ値を表示します。 円が一番下にある時の下辺からの距離を40とし、ここから上の範囲で円が動くようにします。
データ値を元に円を止める最終y座標を計算しておきます。 10ヵ国のデータは、2.8から23.3の間の値です。円が一番下の位置に対応するデータ値を0、円が一番上の位置に対応する値を28と決め、 この間の垂直方向の位置(y座標)をmap関数を使って換算します(エリアの下辺から40ピクセルの地点がy座標のゼロです)。
const circleY = 40; //円が一番下にある時の下辺からの距離 最終y座標 = map(データ, 0, 28, 0, height-circleY); //下辺から40ピクセルの地点をゼロとしたy座標10ヵ国のデータに対して、円の最終y座標を計算して配列lastY[]に入れておきます。 さらに、それぞれの円の途中のy座標を記憶しておく配列currentY[]を用意します。
エリアごとに円を動かし、国名、データ値を書く関数moveUpCircle()を定義します。 この関数内に、演習問題T3-1-2のように y座標の値をスピード分だけ徐々に動かし、最終y座標(止めたい位置)より大きくなったら、スピードをゼロにし、色を変える処理を書きます。
【リストT3-2-1】 const countryNameY = 15; //国名下辺からの距離 const circleY = 40; //円が一番下にある時の下辺からの距離 const d = 30; //円の直径 let speed = 1; let lastY = []; //国ごとの最終y座標 let currentY = []; //国ごとの途中のy座標 function setup() { createCanvas(510, 300); Datamate.make("国", ["Italy", "Japan", "Germany", "Norway", "China", "Australia", "Korea", "India", "USA", "Brazil"]); Datamate.make("企業活動指数", [2.8, 5.4, 7.6, 8.4, 8.7, 10.5, 14.9, 15.0, 17.4, 23.3]); Datamate.makeAreas(0, 0, width, height, 10, 1); Datamate.bindAreas([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); noStroke(); textAlign(CENTER, CENTER); //文字を表示する際、中心の座標を指定 for (let i=0; i<Datamate.columnCount(); i++) { //Datamate.columnCount()はデータテーブルの列数 currentY[i] = 0; //最初は0 lastY[i] = map(Datamate.value(0, i), 0, 28, 0, height-circleY); //円の最終y座標を計算しておく } } function draw() { background(240); for(let i=0; i<Datamate.columnCount(); i++){ moveUpCircle(i); } } function moveUpCircle(number){ const area = Datamate.area(number); // エリアをとりだす const country = Datamate.columnName(number);//列のヘッダ const value = Datamate.value(0, number); if (currentY[number] >= lastY[number]) { //最終y座標になったら speed = 0; //y座標を変えない fill(0, 0, 200); //青にする } else { speed = 1; //そうでないなら1ずつ増やす fill(200, 0, 0); //赤で描く } currentY[number] = currentY[number] + speed; ellipse(area.centerX, area.bottom-currentY[number]-circleY, d, d); //円を描く fill(0); text(country, area.centerX, area.bottom-countryNameY); //国名表示 if (speed == 0) { //数値表示 text(value+"%", area.centerX, area.bottom-currentY[number]-circleY-20); } }
演習問題
【問題T3-2-1】リスト3-2-1を変更し、10ヵ国のデータを円の代わりに、カエルの画像で表して、動かしてみよう。クリックで再始動
カエルの画像のサンプルは、画像ページからコピーできます。