2021/12/11更新(厚生労働省のcsvデータの形式が変更されていたので,それに対応)

Step1 全国の新規陽性者数グラフを作る

(1) 厚生労働省のオープンデータを利用して,全国の陽性者数を受信する

サンプルプログラムはここ

当サイト用に,厚生労働省のオープンデータ(CSV)から必要なデータを取得するAPIを作りました。このAPIをプログラム中で呼び出し,データを受信します。

!非同期モード

API=「./api/get_pcr_positive_daily.php」。
APIからAJAX受信。  // #1
対象を表示。       // #2

必ず「なでしこv3.2.25」以降の「非同期モード」を使ってください。

#1 AJAX受信 … URIを指定して,データを受信します。受信したデータは,対象という変数に格納されます。

#2対象という変数の中身を表示します。実態はCSV形式で,日付と新規陽性者数が並んでいます(次の説明を参照)。

(2) 受信したデータを利用して,棒グラフを描く

サンプルプログラムはここ

!非同期モード

API=「./api/get_pcr_positive_daily.php」。
APIからAJAX受信。
対象をCSV取得して棒グラフ描画。  // #3, #4

対象という変数には,次のような形式(CSV形式)でデータが入っています。

日付,新規陽性者数
2020/1/26,1
2020/1/27,0
2020/1/28,3
2020/1/29,1
 ...

#3 CSV取得 … CSV形式のデータを,二次元配列形式に変換します。詳しい説明は本家で。

#4 棒グラフ描画 … 二次元配列データを与えると,自動的に棒グラフを描いてくれます! 詳しい説明は本家で。

なでしこでは,様々な種類のグラフをカンタンに描くことができます!

Step2 都道府県別の新規陽性者数グラフを作る

(3) 全国の値と,都道府県別の値を受信する

サンプルプログラムはここ

!非同期モード

API=「./api/get_pcr_positive_daily2.php」。  // #5
APIからAJAX受信。
対象を表示。

(1)の時とはAPIが異なる(#5)ので注意。こちらのAPIでは,全国の値各都道府県の値をCSV形式で受信します。

(4) (3)で受信したデータを利用して,全国の陽性者数グラフを描く

サンプルプログラムはここ

!非同期モード

API=「./api/get_pcr_positive_daily2.php」。
APIからAJAX受信。
対象をCSV取得して結果へ代入。    // #6

// 全国データを作成
日付=結果の0を表列取得。        // #7
陽性者数=結果の1を表列取得。    // #8
データ=「{日付}{改行}{陽性者数}」をCSV取得。  // #9
データ=データの表行列交換。                   // #10

// グラフ描画
データ[0]=["日付", "全国"]。    // #11
データを棒グラフ描画。

受信するデータ(対象に格納されるデータ)は,次のように「日付」「全国」「北海道」「青森」…の順にデータが並んでいます。

Date,ALL,Hokkaido,Aomori,Iwate,Miyagi, ....
2020/8/14,1355,12,1,1,0, ....
2020/8/15,1233,14,0,0,0, ....
2020/8/16,1015,8,0,1,0,  ....
2020/8/17,630,5,0,0,1,   ....

これを見やすく表形式にすると,次のようになっています。

#6 … 上記のデータ(CSV形式)を,二次元配列形式に変換して,結果という変数へ代入します。

次に,前述の(2)と同じように「日付」と「全国の陽性者数」をカンマで区切ったデータ(全国の新規陽性者数の配列)を作るために,#7から#10で処理をしています。

#7結果という変数の0列目(列は0,1,…と数えるので結果の0をと書く)を取り出して,日付という変数へ格納します。

配列変数「日付」の内容

#8結果という変数の1列目(「ALL」と書かれている,全国の値が入っている列)を取り出して,陽性者数という変数へ格納します。

配列変数「陽性者数」の内容

#9「{日付}{改行}{陽性者数}」をCSV取得 … 2つの配列(日付と陽性者数)をくっつけて,二次元配列にしています。それをデータという変数へ格納します。このとき,配列の中のデータは,横並び(列がたくさんあり,行は2つのみ)に並んでいます。

二次元配列「データ」の内容

#10 表行列交換 … グラフを表示させるためには,縦並びの配列(行がたくさんあり,列が2つ)にする必要があります。そこで,表行列交換という命令を使って,配列の並びを変換します。これで データという変数 の中身は,次のように,縦並びの二次元配列になりました。

#11データという変数(二次元配列)の0行目(つまり先頭行)はグラフに表示される表題として使われます。そこで,表題を 「日付」「全国」という文字列 に変更します。

最後は,データという変数(二次元配列)を利用して,棒グラフを描画します。

(5) (3)で受信したデータを利用して,全国と東京の陽性者数グラフを描く

サンプルプログラムはここ

!非同期モード

API=「./api/get_pcr_positive_daily2.php」。
APIからAJAX受信。
対象をCSV取得して結果へ代入。

// 全国データを取得
日付=結果の0を表列取得。
陽性者数=結果の1を表列取得。

// 地域データを取得
地域列=14。                            // #12
地域陽性者数=結果の地域列を表列取得。  // #13
地域名=地域陽性者数[0]。               // #14

// 表示用の二次元配列を作成
データ=「{日付}{改行}{陽性者数}{改行}{地域陽性者数}」をCSV取得。  // #15
データ=データの表行列交換。

// グラフ描画
データ[0]=["日付", "全国",地域名]。
データを棒グラフ描画。

プログラム自体は,前述の(4)に,都道府県のデータを処理する部分を加えただけです。そのため(4)から変更されたところだけ説明します。

#12 … (4)と同じで,受信したデータは結果という変数(二次元配列)に格納されています。その中身は次のようになっています。

この配列の1行目には,都道府県名が入っています。北海道は2列目,青森は3列目,岩手は4列目…という順に並んでいます。そこで,取得したい都道府県のデータが入っている列の番号を,地域列という変数にセットしておきます。サンプルにある14列目とは,東京都を表しています。

#13 … (4)の#8と同じ。#12で選んだ列(都道府県)のデータを取り出しています。

#14地域陽性者数という変数(二次元配列)の0列目=都道府県名だけを取り出して,地域名という変数へ格納します。

#15 … (4)の#9と同じように,3つの配列をくっつけて,表行列変換という命令で縦並びの二次元配列を作っています。

最後は,データという変数(二次元配列)を利用して,棒グラフを描画しています。

Step3 (5)を改良して,都道府県を選べるようにする

サンプルプログラムはここ

!非同期モード

API=「./api/get_pcr_positive_daily2.php」。
APIからAJAX受信。
対象をCSV取得して結果へ代入。

// 都道府県名を取得                  #16
地域一覧=結果[0]を配列複製。     // #17
地域一覧の0を配列削除。
地域一覧の0を配列削除。

// 画面の準備                        #18
地域ボックス=地域一覧のセレクトボックス作成。
グラフボタン=「グラフ描画」のボタン作成。
色チェック=「色を変更」のチェックボックス作成。

グラフボタンをクリックした時には  // #19
    // 全国データを取得
    日付=結果の0を表列取得。
    陽性者数=結果の1を表列取得。

    // 地域データを取得
    地域列=地域ボックスの「selectedIndex」をDOM属性取得。  // #20
    地域陽性者数=結果の(地域列+2)を表列取得。              // #21
    地域名=地域陽性者数[0]。

    // 表示用の二次元配列を作成
    データ=「{日付}{改行}{陽性者数}{改行}{地域陽性者数}」をCSV取得。
    データ=データの表行列交換。

    色=色チェックの「checked」をDOM属性取得。              // #22
    もし,色=オフならば
        // グラフ描画 方法1 標準の配色
        データ[0]=["日付", "全国",地域名]。
        データを棒グラフ描画。
    違えば
        // グラフ描画 方法2 配色を変えたいとき                #23
        日付の0を配列削除。
        陽性者数の0を配列削除。
        地域陽性者数の0を配列削除。
        dataset = {
            labels: 日付,
            datasets: [{
              label: '全国',
              data: 陽性者数,
              backgroundColor: 'rgba(255,0,0,0.5)'
            },{
              label: 地域名,
              data: 地域陽性者数,
              backgroundColor: 'rgba(0,255,255,1)'
            }]}
        datasetの棒グラフ描画。
    ここまで。
ここまで。


#16 … 上の(5)の#12で説明したように,結果という二次元配列の0行目(結果[0]と指定します)には都道府県名が入っています。

Date, ALL, Hokkaido, Aomori, Iwate, ...

これを都道府県を選択するセレクトボックス(#17)で利用したいのですが,冒頭の2つは「Date」「ALL」となっているので,セレクトボックスには不要です。そこで,まず結果[0]地域一覧という配列に複製します(単なる代入ではうまくいきません。詳細は本家の解説を参照してください)。そこで地域一覧の0を配列削除という命令を2回実行して,この2つを削除しています。

#18 … 都道府県を選択させるセレクトボックス,グラフを描画するボタン,色を変えるかどうかを選ぶチェックボックスを設置します。

#19[グラフ描画]ボタンをクリックしたときの処理です。上の(5)と同じ処理をしています。

#20 … セレクトボックスで選択されている都道府県名が,ボックス内の配列の何番目なのかを 「selectedIndex」をDOM属性取得 という命令で取得しています。これは#12で都道府県の列番号を手入力で変更していたのを,セレクトボックスで選べるようにしたということです。その後は#13#14と同じように処理して地域陽性者数という変数(二次元配列)に,選んだ地域のデータを格納します。

#21結果の(地域列+2)を表列取得と「+2」をしているのは,セレクトボックスで選ばれている都道府県の番号は0から始まっている(北海道は0,青森は1,…)のですが,結果という二次元配列では,(5)#12で説明したように2列目から始まっている(北海道は2列目,青森は3列目,…)ので,その調整をしているからです。

#22 … このように書くことで,という変数には,チェックボックスにチェックが入っていれば「オン」が,入っていなければ「オフ」が返されます。

#23 … 標準の「棒グラフ描画」命令ではグラフの色を指定できませんので,色を指定したいときはこのようにプログラムを書きます。詳細な説明は本家で。