MZ Platformとは › 掲示板 › MZプラットフォームユーザー会掲示板 › 折れ線グラフの編集方法
- このトピックは、 9 返信、 2 投稿者 です。最終更新日: 3 年, 6 ヶ月 前 MZPlatformユーザー会
-
著者投稿
-
2021年4月27日 at 6:55 PM #6399yagami一般参加者
IoTでサーバーに取り込んだ温度のデータ取り出すプログラムを作ったのですが、その後の折れ線グラフ化で質問があります。
テーブルフィールドに「SQL文を実行する」⇒折れ線グラフに「テーブルデータを取得する」で作成すると縦軸に温度、横軸に時刻が出ました。温度の最大値と最小値の設定は、「SetNumberAxis~」でできたのですが、時刻がすべてのデータの時刻が表示され、文字がつぶれています。またスクロールバーがでて全体が表示されません。
また時刻表示を減らして確認するとが「Mon Apr 26 09:45:02 JST 2021」「Mon Apr 26 09:46:03 JST 2021」とな「Mon Apr 26 09:49:02 JST 2021」とIoTデータが1分間隔や2分間隔の時がありますが、プロットの点は等間隔になっているように見えます。下記の5点について変更可能でしょうか。メソッドの項目を教えてください。
1.スクロールではなくグラフ自体の横幅は一定
2.表示項目数は、テーブルデータの行数
3.時刻表示は「hh:mm」
4.プロット間隔は時刻の間隔に合わせる
5.ログ開始時間からを15分置きや30分置きに変更する
(例:9:45,10:00,10:15・・・
9:47,10:02,10:17・・・)宜しくお願い致します。
2021年4月27日 at 10:40 PM #6401MZPlatformユーザー会サイト管理者最新のバージョン3.6においても、折れ線グラフは横軸に項目軸を取るグラフですので、対象列が日時データであれば文字列に変換されてすべての日時が項目として表示され、ご報告いただいたようなグラフになります。これに対してグラフ側の設定だけでご希望の表示をすべて実現することはできません。
グラフ側で変更可能なものは、1と2で、設定するテーブルデータの行数を表示項目数に設定することができ、そうすればスクロールバーは表示されません。実行中の右クリックで表示されるメニュー(項目軸>表示項目数)から設定できますし、日本語化されていないメソッド(setItemAxisDisplayCount(int))を使えば設定可能です。
3と4と5は、現状SQL文でグラフ表示に必要なテーブルデータに整形する必要があります。日時のデータを指定の文字列で出力するように指定して、必要な間隔のデータとなるように集約(例えば平均化)します。
一方、指定間隔のデータに集約しても抜けがある場合への対応や、行数が多い時に項目名がつぶれてしまう問題は残るので、MZ側でグラフ表示用に値を埋めたり表示項目名を間引いたりするなどの工夫も必要となります。
以上のような工夫を駆使して作っているのが、配布版ツールキットに付属のデータ可視化用のサンプル(IoTDBViewer.mzax)ですので、参考にしていただければ幸いです。こちらはかなり複雑なので読むのが難しいと思いますが、ご不明な点を一つずつお問い合わせください。
2021年4月28日 at 1:14 PM #6403yagami一般参加者返信ありがとうございます。
配布版ツールキットのデータ可視化用サンプルはどこを確認するとよいのでしょうか。2021年4月28日 at 1:16 PM #6404yagami一般参加者「データ解析 IoTDBViewer.mzax」見つかりました。
中身を確認してみます。2021年4月29日 at 8:39 PM #6406yagami一般参加者2時間の温度ログを5分間隔で平均化してグラフ化してみようと考えてみました。
「5分間隔テーブル」を作る際に繰り返しを使って簡略化したいのですが、繰り返しの使い方がよくわかりません。作成中のデータを確認いただき、アドバイスしてもらえないでしょうか。2021年4月30日 at 7:56 PM #6410MZPlatformユーザー会サイト管理者ご質問内容と添付されたMZアプリだけでは、何を回答すればよいのかわかりません。
SQL文でどのようなテーブルを取得して、それをどのように簡略化したいのかご説明いただき、そのときForで何をしたくてその実現方法がわからないのかご説明ください。
なお、添付されたMZアプリを拝見すると、SQL文が不十分のように見受けられます。
こちらはデータを実際に取得して確認したでしょうか。2021年5月6日 at 6:55 PM #6413yagami一般参加者説明不足で大変失礼いたしました。
質問内容を具体的に記入したものを添付いたします。
不十分ところもあるかと思いますが再度確認のほどよろしくお願いします。
SQL文からのデータ取得はできております。2021年5月10日 at 9:18 PM #6415MZPlatformユーザー会サイト管理者ご質問内容は理解できました。
確かにForでSQL文の実行を繰り返してご希望のテーブルデータを作成することもできますが、SQL文を工夫する方がMZ側の処理が簡単になります。下記にSQL文例のイメージを書きます。
SELECT (TIME_TO_SEC(TIMEDIFF(time,'[開始日時]’)) DIV 300 + 1)*5 AS timespan, AVG(value), MAX(value), MIN(value) FROM data_table WHERE time>='[開始日時]’ AND time<‘[終了日時]’ AND ..[その他の条件].. GROUP BY timespan;
ポイントは、GROUP BYで集約する対象を工夫して作成することです。ここでは、開始日時から終了日時までを5分単位で区切り、その範囲に含まれる値を集約することで一度にテーブルが取得できるようにしています。具体的には、日時の差分を秒単位に変換してから5分を示す300秒で整数の割り算をして、それに1を足してから5をかけると5分単位の経過時間になります。
なお、上記はMySQLを前提に書いていますが、お使いのDBMSによっては文法が異なることがありますので、その場合はお使いのDBMSに合わせた修正が必要です。(対応する関数が存在しない場合は方法を別に考える必要があります)
2021年5月11日 at 3:55 PM #6416yagami一般参加者ご回答ありがとうございます。
SQL文を試してみましたが、
microsoft sql server management studioを使っているようで、エラーが出てしまいました。
【TIME_TO_SEC(TIMEDIFF】が働かないようです。
同様の機能がないか。調べてみますが、代替案がありましたらご教授いただければ幸いです。2021年5月11日 at 8:12 PM #6417MZPlatformユーザー会サイト管理者情報ありがとうございます。
確かに、SQL Serverの関数にTIME_TO_SECとTIMEDIFFが無いようです。代わりにDATEDIFFがあるようなので、お試しください。
https://docs.microsoft.com/ja-jp/sql/t-sql/functions/datediff-transact-sql?view=sql-server-ver15SELECT (DATEDIFF(second,time,'[開始日時]’) DIV 300 + 1)*5 AS timespan, AVG(value), MAX(value), MIN(value) FROM data_table WHERE time>='[開始日時]’ AND time<‘[終了日時]’ AND ..[その他の条件].. GROUP BY timespan; こちらでは動作確認していませんが、MySQLでない場合いろいろ書き替えないといけないと思いますし、GROUP BY等の指定がこれでOKかはわかりません。エラーが出たらメッセージもお知らせいただければ参考になるかもしれません。 また、独自に解決できましたらご報告いただけると助かります。
-
著者投稿
- このトピックに返信するには、ログインしてください。