前回までに、例えば毎月の売上や営業成績などの時系列データについて、データの補間をして、自動でグラフのソースを 遷移させ、画像として出力し、動画化するという一連の流れを通してみました。それらをより使いやすく統合し、最短で2分もかからずに動くグラフ(モーショングラフ、モーションチャート)が作成できるマクロファイルを作成してみましたので紹介します。
English page is here.
https://magtanate.blogspot.com/2021/09/Lang-English-easy-motion-graph-file.html
DIY360
統合版の入手
以下リンク先より入手できます。
※2021年11月17日追記:ありがたいことに、プロモーションは間もなく終了となります
https://diy360.booth.pm/items/3180113
↓追記です、機能アップ版もあります
https://magtanate.blogspot.com/2021/08/moving-bubble-chart.html
DIY360
統合版で出来る動くグラフの例
いくつか試してみたので紹介します。紹介するもの以外にもExcelで出来るようなグラフは対応できる可能性があります。慣れれば2分程度でこういったものが作成可能です。
例1.棒グラフ(3Dも)
通常の棒グラフはもちろんですが、3D化したものも可能となります。これは3D棒グラフを作成後、グラフデザインでプリセットのデザインを選んだものとなります。もちろん3Dの角度は自由に変えられますし、いつもの静止画の棒グラフのように、棒ごとに色を変えることもできます。
例2.横棒グラフ(3Dも)
縦棒グラフが動くので、当然横棒グラフも動きます。これも3D棒グラフを作成後、バーの形を円柱に変更し、個別に色を変えたものです。
例3.折れ線グラフ
縦棒グラフと基本的に形式は同じなので、動きます。これも折れ線グラフを作成後、グラフデザインのプリセットから適当に選んだものです。下の方に数値も表示されるのが面白いですね。
もし折れ線グラフでも線が右にスーッと伸びていくような動くグラフが欲しい場合は、このマクロは使わずとも、Powerpoint上でアニメーションを利用することで作成可能です。
例4.円グラフ(3Dも)
円グラフを作成後、グラフデザインのプリセットから選んだり、それにデータラベルを追加したりするとこのようなものも作成できます。
系列オプションから「円グラフの切り離し」の数値を上げると、
という感じにもできます。また円グラフ作成時に補助円付き円グラフを選ぶと
といったものも当然可能になります。なんか楽しい。。
例4.レーダーチャート
これも折れ線グラフと基本的には同じっぽいので、可能でした。点の色とか変えるとより分かりやすいのかな。。
例5.バブルチャート(座標は固定、バブルの大きさが変化)
これは上記までのグラフ形式と異なり、X座標、Y座標、バブルの大きさ、という3つの要素が必要となります。そのため、少々オプションを追加しました。要はX座標とY座標を表示するための2行を追加して、バブルの大きさのみを連続して参照していくという感じになっています。
座標に緯度経度を入力すれば、日本地図や世界地図と合わせて使用することが出来て便利かなぁーと思って追加した機能です。(下の方で地図と組み合わせた例を紹介します!)
ちなみに割と新し目のExcelにはマップと合わせる機能(塗り分けマップ)がありますが、今回のマクロはこれには対応していません、残念。
統合版のシート構成
統合版は以下3枚のシートで構成されています。
- 生データ・・・その名の通り、補間する前のデータを入力するためのシート。
- 補間結果・・・補間結果が表示され、結果をグラフで確認したり、動くグラフ化したいグラフを作成したり調整したり、画像として出力するためのシート。
- mp4動画として出力・・・出力された画像を、長さや滑らかさを設定しつつ動画化するためのシート。
項目数が多いデータにも対応できるようにするために、1枚のシートで完結させるよりも別シートに分けることにしました。
今回はまず「生データ」シートの説明をしたいと思います。
シート「生データ」入力説明
生データシートは↓のような画面となっています。サンプルデータが格納された状態ですね。
希望する補間データ数をセルB4に
セルB4には、希望する希望する一項目あたりの補間のデータ数を入力します。右隣のセルC4に推奨値が自動で表示されるようにしてあります。たとえば生データ自体がサンプルのように10行分あるとしたら、推奨値としては{(10-1)×任意の整数}+1となります。
ちなみに推奨値でなかったからといって必ずしも計算できないわけではありませんが、計算のズレが生じる可能性が高くなります。
なおセルB4は、一応9999以下として下さい。マクロを書き換えればそれ以上にも対応できますが・・・、スペックの低いPCでも動くように、念の為9999を上限としてあります。
日付時刻、あるいは単なる連番をセルF2から下方向に
セルF1にTime or No.と入力されていますが、その名の通りこのF列には日付や時刻、あるいは1,2,3といった連番を入力します。整数でも小数点以下があるものでも、あるいはマイナスから始まるものでも大丈夫ですし、原理上多少ズレが生じますが、多くの場合で均等間隔でない場合にも対応できそうです。
それから、日付時刻を入れる場合は、Excelがそれをシリアル値(日付時刻を数値化したもの)として認識出来ていれば、問題ありません。
例えばセルF2に、2021/05/01 10:00 と入力しますと、Excelはこれが日付時刻だと勝手に認識しますので、表示上はYYYY/MM/DD hh:mmですが、裏では44317.4166666667というシリアル値として処理されています。
もし例えば18時間ごとのデータだったとしたら、セルF3には =F2+"18:00" と入力してやれば、18時間後の 2021/5/2 4:00 というのが表示されるはずです。一応動画にしてみました。
生データをG列以降に(多項目なデータに対応させました)
G列以降には生データを入力します。1行目には項目名を、2行目以降に生データとなる時系列データなどを入力します。数値の下限や上限など特に設定していません。Double型で定義してるので、1.8×10(308乗)まで大丈夫とのことでして、ほぼ問題ないはずです。。
注意点ですが、最大2000行までに設定してありますので、それを超えないようにご注意ください。これもマクロを書き換えれば、より行数を増やすこともできますが、なるべく多くのPCで問題なく動くようにするために念の為制限をかけています。
また、列数については、多項目なデータに対応させるようにしました。最大項目数については特に制限はかけておらず、Do~While文で、列が空欄になるまで処理を続けさせてます。ただ、線形補間処理を開始する際に、補間結果シートを一旦クリアしているのですが、そのクリア範囲設定がZZ列までなので、そこまでにしておいた方がいいかもしれません。もちろんPCのスペック次第では、もっと少なくした方が無難です。
それから、欠損値(空白セル)があった場合はゼロと判断されてしまいますので、ご注意ください。ご自身で任意の値(前後の平均とか)を入れてもらえればと思います。
線形補間マクロの実行
実行方法は簡単で、上記に沿って生データの入力が終わったら、「線形補間を実行」のボタンを押します。
そうすると「補間結果シートにあるデータは一旦削除されます、宜しいですか?」というメッセージボックスが現れます。問題なければ「はい」を、ちょっと止めたいという場合は「いいえ」を選びます。
上記で「はい」を選んだ場合は、補間結果シート上のデータが一旦クリアされ、その後補間計算処理が実行されます。
進捗の状況については、画面下部のステータスバーに表示されるようにしてありまして、処理中にフリーズしてないか確認可能です。
大まかな流れとしては、
- 生データのF列を読み込み
- F列を希望する補間データ数に合わせて補間計算し、補間結果シートに出力
- 生データのG列を読み込み
- F列補間値に対応するG列の補間値を計算し、補間結果シートに出力
- 生データのH列を読み込み
- F列補間値に対応するH列の補間値を計算し、補間結果シートに出力
- ・・・(I列、J列、K列と繰り返していく)
- 列が空欄になったら処理を停止(Do~Whileループを抜ける)
- 補間結果シートにあるグラフに、生データと計算(補間)結果を比較するためのデータを渡す
- 計算中、生データと補間値とのズレが一定以上になったケースがあった場合にある変数が増えるようにしておき、その結果次第で注意メッセージを表示する
という感じです。
基本的なスクリプトの考え方は前回までに説明した通りで、多項目に対応できるようにG列以降の処理をDo~Whileループで繰り返す感じです。
その他メッセージボックスの表示やシートのクリア処理、ステータスバーの表示については、素人の私があえてここで説明しなくても検索すればすぐに出てきますので省略します。
シート「補間結果」の説明
シートの構成
補間結果シートは↓のような構成になっています。
セルB1には補間後のデータ行数(データの部分のみ、項目名は除く)が自動カウントされたものが表示されます。ちなみにG列のデータ数をカウントしていますので、G列にある欠損値にはご注意ください。
セルD1には項目数(Time or No.を除く部分、G列より右の列数)が自動カウントされたものが表示されます。ちなみにG列の5行目(G5)から右に向かってセルを数えてます。こちらも欠損値にはご注意ください。5行目にしたのはなんとなくなんで、変えても大丈夫です。。
「確認グラフ機能で補間結果を確認する」ボタンの説明
このシートには、予め生データと補間値のズレが無いことを確認するためのグラフ(タイトルは「結果確認(一部)」)が表示されています。
文字通り、このグラフはF列とG列のデータのみを元に描画したものとなっています。
もしH列、I列など多項目のデータを処理しており、その結果を確認したい場合には、このボタンを連続して押すことで、次々に結果を確認グラフに表示させることができます。
セルB3には、このボタンを押した場合に表示されるG列以降の列番号が表示されており、ボタンを押すたびに自動で増加します。これ以上項目が無い場合は1に戻る(=G列に戻る)という動作となります。とにかく計算結果にズレが生じていないことを、このボタンを連打するだけで確認するための機能となります。
「指定の値にグラフのサイズを設定しテスト画像を出力」ボタンの説明
セルB2とD2には、それぞれグラフを画像として出力する際のサイズ(ピクセル)を設定できるようにしてあります。
これらのセルに希望するピクセルを設定しておいて、(次項で後述の方法により)動くグラフ化したいグラフの原型を作成・選択(アクティブに)しておき、このボタンを押しますと、グラフサイズが指定されたものに変更されるとともに、グラフのPNG画像がフォルダ(C:\MovingGraph_workingfolder)に出力されます。
ただし注意点として、横サイズを300で設定したとしても、なぜか出力される画像が301になってしまったりすることが稀にあります。この場合は299に設定してみてください。このあたりの厳密な調整は困難っぽいので、このテスト出力ボタンで出力される画像を見ながらセルB2とD2に入れる数値を調整してください。
厳密な調整が不要であれば、あまりこだわる必要はないです。以前、仕様上FFmpegで奇数ピクセルの画像を変換するのが不可と書きましたが、その後スクリプトに工夫を入れることで回避に成功しています(後述)。
「棒グラフ、円グラフを連続処理」ボタンの説明
このボタンを押す前に、動くグラフ化したいグラフの原型を作成しておく必要があります。原型というのは、初めのデータ(1行目と2行目)のデータのみを用いて作成した棒グラフなり円グラフなりを意味します。
↓元々入っているサンプルデータを使って例を示しますと、セルG1からL2を選び、挿入→棒グラフとします。
↓続いて第2回でも書いたように、縦軸の範囲を固定しておきます(でないと縦軸が常に変化するようなグラフになってしまいますので)。
また、連番あるいは時刻をグラフタイトル部に表示させたい場合は、セルE1のリストメニューから「Time or No.有り」を選んだ状態にしておき(デフォルトではON)、
↓グラフを右クリックしてデータ選択→凡例項目(系列)→編集 と進み、
↓セルF2を選びます。
↓最後、ちょっとだけタイトルの位置を動かした上で、ホームタブの配置リボンにある、”左寄せ”を選んでおきます(でないと小数点に合わせてブルブルしてしまいます)。ちなみに、「ちょっとだけタイトルの位置を動かす」理由ですが、これをやっておかないと何故か私のExcelのバージョンでは左寄せが効かないのです。。。Excelのバグかな。
↓また必要に応じてデータラベルを追加してもかまいません。
↓ただ動画化した時にラベルがブルブル震えたりする場合は、データラベルの左寄せや、表示する桁数をなるべく統一する(小数点以下は表示しないようにする)などの工夫が必要です。これはケース・バイ・ケースなので試してもらいながら調整して頂くしかありません。。
以上が終わったら、グラフが選択(アクティブ化)されていることを確認の上、「棒グラフ、円グラフを連続処理」ボタンを押しますと処理が始まります。開始時、C:\MovingGraph_workingfolderが(なければ)作成されまして、そこに連続出力された画像がTransition_00000.pngという連番名で格納されます。前のデータが残っている場合、上書きされてしまいますのでご注意ください。
※処理中はExcelで他のセルをクリックしたりしないでください。グラフがアクティブじゃない(選択されてない)状態になるとエラーが発生してしまいます。エラーが発生したら、終了を選択し、グラフを再度クリックして、選択(アクティブ化)し、再度ボタンを押して下さい。
「バブルチャート座標用セル追加」と「座標用セル解除」ボタンの説明
大きさが変化するバブルチャートを作りたい場合のために用意しました。座標は固定でして、その座標を入力するための2行を追加するためのボタンとなります。
押すとF列以降に2行セルが挿入されますので、そこにX座標とY座標を入れます。もしやっぱやーめた、ということであれば、座標用セル解除ボタンを押すと、当該セルが削除されます。削除されると入力した座標数値は消えてしまうのでご注意を。
ちなみに以前書いた通り、緯度経度などを入力してやれば、↓のように地図上でバブルの大きさを経時変化させることも可能です。なお、これは手書きの地図です、ヘタですんません。。
2行目から4行目までの3行を使って、挿入→バブルチャートでバブルチャートを作成します。あとは棒グラフの場合と同じです。
地図などを入れたかったら、グラフエリアのオプションで、塗りつぶし(図またはテクスチャ)を選び、適当な地図を挿入します。その下のオフセットというところで地図サイズなど微調整もできます。
追記:バブルが移動するバージョンも作ってみました!
https://magtanate.blogspot.com/2021/08/moving-bubble-chart.html
DIY360
シート「mp4動画として出力」の説明
シートの構成
↓このシートには、入力可能なセルが3箇所と、ボタンが3つあります。
↓セルD3には以下の自動設定計算に必要な情報として、補間データの行数が自動で反映されるようにしてあります。
ボタン「指定した動画の秒数からスムーズさを自動設定する」
例えば361のデータ数で15秒の動画を作りたい時は、1秒間のコマ数(スムーズさ)は361÷15で24.07となります。つまり秒数に15と入力しておいてこのボタンを押すと、スムーズさが24.07に自動で反映される仕組みです。うん、大したことないものを大げさに説明してしまいました、ごめんなさい。
ボタン「指定したスムーズさから動画の長さを自動設定する」
逆に、361のデータでスムーズさを30にしたい場合、361÷30=12.03となりますが、ここで12.03をそのまま反映させてしまうと最後のフレーム1枚だけがが動画に反映されなかったりするので、繰り上げたものがセルに自動入力されるようにしてあります。なお、この設定で動画を作成しても、動画ファイルのプロパティには12秒と表示されていますが、フレームは全て使用されていました。四捨五入したものがプロパティには表示されるのですかね。。
画質設定セルE5「51(最低)→16(推奨)→0(最高)」
出力するビデオの画質です。51だとファイルサイズはめちゃめちゃ小さいですが、画質もヒドいです。逆に1とかだと画質は良いですが、ファイルサイズが重いです。個人的に16くらいがサイズと画質のバランスがいいかなと思います。
色にグラデーションとか使ってる場合は、数値を小さくした方が(=画質を良くした方が)無難です。
ボタン「mp4動画を出力」
上記設定が終われば、あとはこのボタンでFFmpegを呼び出して動画化するだけとなります。500枚以下なら大体数秒で終わります。
※FFmpegを導入していない場合は、前回の投稿をご覧になって必ず導入しておいてください、そんなに手間ではありません!
出力先は画像の場合と同じく、C:\MovingGraph_workingfolderとなります。
ちなみにファイル名ですが、以下のように指定していて、例えば20210803105156_movie_graph.mp4のように、_movie_graph.mp4の前に作成時の年月日と時間がつくようになっています。
Dim strNow As String
strNow = Format(Now, "yyyymmddhhnnss")
これを、以前述べたようにFFmpegに渡すコマンドに渡してる感じですね。
また、以前は奇数ピクセルだとFFmpegでの動画化に失敗するとしましたが、同じくFFmpegに渡すオプションとして
pad=ceil(iw/2)*2:ceil(ih/2)*2
を設定していますので、奇数でも大丈夫になりました。一回2で割ってから、2倍して偶数にしているようです。うーん、なるほど。。
(参考:https://stackoverflow.com/questions/20847674/ffmpeg-libx264-height-not-divisible-by-2)
最後に
今回は、前回までに作成した線形補間→グラフのソースの連続移動とパラパラ漫画のコマ出力→mp4動画化の流れを1つにまとめ、より使いやすくした統合版のファイルについて、その使い方を紹介をしました。
一連の操作を動画にしてみました。
このファイルの使い方は大体以上になります。あまりスクリプトの中身については述べていませんが、基本は前回までに投稿した通りで、必要であればこのファイルを入手して頂いてスクリプトの中身(暗号化していません、誰でも見られるようになっています)をご確認頂ければと幸いです。