質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

解決済

pythonで複数のグラフの同時表示

CSISC
CSISC

総合スコア6

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

2回答

0評価

0クリップ

3551閲覧

投稿2018/07/09 08:01

前提・実現したいこと

初めて質問いたします。pythonにて複数のセンサ(TWILITE2525A)から取得したデータをリアルタイムにグラフ表示するプログラムを作成したいです。https://github.com/ubi-naist/2525Utilを参考に複数(とりあえず2台)のセンサから加速度を取得するプログラムを作成したいのですが、1台目のデータしか表示されない状況です。

プログラミングについてはど素人で、基本的な理解が足りない部分が多くあると思いますが、どなたか解決策のご教授お願いいたします。
コードは以下の通りです。

発生している問題

エラーメッセージは表示されませんが、1台分のグラフしか表示されません。

該当のソースコード

python

# -*- coding: utf-8 -*- import serial import threading import matplotlib.pyplot as plt import numpy as np import time import copy import os from argparse import ArgumentParser from Twilite2525AReceiver import Twilite2525AReceiver sensor_data = {} log = False log_folder = 'log' log_path = '' data_keys = ['rc', 'lq', 'ct', 'ed', 'id', 'ba', 'a1', 'a2', 'x', 'y', 'z', 'ts'] def argv_parser(): argparser = ArgumentParser() argparser.add_argument('--log', action='store_const', const=True, default=False) args_param = argparser.parse_args() return args_param def port_reader1(file_name='port1.txt'): with open(file_name, 'r') as p_file: port1 = p_file.readline().strip() return port1 def port_reader2(file_name='port2.txt'): with open(file_name, 'r') as p_file: port2 = p_file.readline().strip() return port2 def received(timestamp, data, length=50): # print(timestamp, data['ed'], data['id'], data['ct'], data['lq'], flush=True) if log: content = str(timestamp) for key in data_keys: content += ',' + data[key] with open(log_path, 'a') as f: f.write(content + '\n') keys = ['time', 'x', 'y', 'z'] x = float(data['x'])/100. y = float(data['y'])/100. z = float(data['z'])/100. values = [timestamp, x, y, z] ed = data['ed'] + ':' + data['id'] # print(timestamp, ed, x, y, z) if ed in sensor_data.keys(): if len(sensor_data[ed][keys[0]]) >= length: for key, value in zip(keys, values): sensor_data[ed][key].pop(0) for key, value in zip(keys, values): sensor_data[ed][key].append(value) else: sensor_data[ed] = {} for key in keys: sensor_data[ed][key] = [] sensor_data[ed]['time'].append(timestamp) sensor_data[ed]['x'].append(x) sensor_data[ed]['y'].append(y) sensor_data[ed]['z'].append(z) def plot_data1(start_time): keys = ['x', 'y', 'z'] current_node_size = 0 plot_dict = {} while True: sensor_data_cp = copy.deepcopy(sensor_data) node_size = len(sensor_data_cp.keys()) if node_size > 0: if current_node_size != node_size: current_node_size = node_size plt.close() fig, axs = plt.subplots(node_size, 1) plot_dict = {} if current_node_size == 1: axs = [axs] for ed, ax in zip(sensor_data_cp.keys(), axs): plot_dict[ed] = {} plot_dict[ed]['ax'] = ax time_array = np.array(sensor_data_cp[ed]['time']) - start_time for key in keys: plot_dict[ed][key], = ax.plot(time_array, sensor_data_cp[ed][key]) ax.set_ylabel(ed) else: for ed in plot_dict.keys(): time_array = np.array(sensor_data_cp[ed]['time']) - start_time if len(time_array) < 2: continue for key in keys: plot_dict[ed][key].set_data(time_array, sensor_data_cp[ed][key]) plot_dict[ed]['ax'].set_xlim((time_array.min(), time_array.max())) plot_dict[ed]['ax'].set_ylim((-3, 3)) # print(len(time_array)) plt.pause(0.05) def plot_data2(start_time): keys = ['x', 'y', 'z'] current_node_size = 0 plot_dict = {} while True: sensor_data_cp = copy.deepcopy(sensor_data) node_size = len(sensor_data_cp.keys()) if node_size > 0: if current_node_size != node_size: current_node_size = node_size plt.close() fig, axs = plt.subplots(node_size, 1) plot_dict = {} if current_node_size == 1: axs = [axs] for ed, ax in zip(sensor_data_cp.keys(), axs): plot_dict[ed] = {} plot_dict[ed]['ax'] = ax time_array = np.array(sensor_data_cp[ed]['time']) - start_time for key in keys: plot_dict[ed][key], = ax.plot(time_array, sensor_data_cp[ed][key]) ax.set_ylabel(ed) else: for ed in plot_dict.keys(): time_array = np.array(sensor_data_cp[ed]['time']) - start_time if len(time_array) < 2: continue for key in keys: plot_dict[ed][key].set_data(time_array, sensor_data_cp[ed][key]) plot_dict[ed]['ax'].set_xlim((time_array.min(), time_array.max())) plot_dict[ed]['ax'].set_ylim((-3, 3)) # print(len(time_array)) plt.pause(0.05) def main(): try: # twilite2525 port1 = port_reader1() port2 = port_reader2() ser1 = serial.Serial(port1, 115200, timeout=1) ser2 = serial.Serial(port2, 115200, timeout=1) if log: log_file = open(log_path, 'w') header = 'timestamp' for key in data_keys: header += ',' + key log_file.write(header + '\n') log_file.close() twilite1 = Twilite2525AReceiver(ser1, received) twilite1.run() # matplotlib start_time = time.time() plot_data1(start_time) twilite2 = Twilite2525AReceiver(ser2, received) twilite2.run() # matplotlib start_time = time.time() plot_data2(start_time) except serial.SerialException: print('error:could not open port') exit(-1) if __name__ == '__main__': args = argv_parser() if args.log: print('-- logging option') log = True if not os.path.exists('.' + os.sep + log_folder): os.mkdir(log_folder) timestamp_str = str(int(time.time())) log_path = '.' + os.sep + log_folder + os.sep + timestamp_str + '-log.csv' main()

補足情報

TWILITE2525Aについて
https://mono-wireless.com/jp/products/TWE-Lite-2525A/index.html

以下のコードを参考にしました。
https://github.com/ubi-naist/2525Util

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。