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

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

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

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

Python 3.x

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

IoT

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

Q&A

解決済

2回答

4066閲覧

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

CSISC

総合スコア6

Matplotlib

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

Python 3.x

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

IoT

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

0グッド

0クリップ

投稿2018/07/09 08:01

前提・実現したいこと

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

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

発生している問題

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

該当のソースコード

python

1# -*- coding: utf-8 -*- 2import serial 3import threading 4import matplotlib.pyplot as plt 5import numpy as np 6import time 7import copy 8import os 9from argparse import ArgumentParser 10 11from Twilite2525AReceiver import Twilite2525AReceiver 12 13sensor_data = {} 14 15log = False 16log_folder = 'log' 17log_path = '' 18 19data_keys = ['rc', 'lq', 'ct', 'ed', 'id', 'ba', 'a1', 'a2', 'x', 'y', 'z', 'ts'] 20 21def argv_parser(): 22 argparser = ArgumentParser() 23 argparser.add_argument('--log', action='store_const', const=True, default=False) 24 args_param = argparser.parse_args() 25 return args_param 26 27def port_reader1(file_name='port1.txt'): 28 with open(file_name, 'r') as p_file: 29 port1 = p_file.readline().strip() 30 return port1 31 32def port_reader2(file_name='port2.txt'): 33 with open(file_name, 'r') as p_file: 34 port2 = p_file.readline().strip() 35 return port2 36 37def received(timestamp, data, length=50): 38 # print(timestamp, data['ed'], data['id'], data['ct'], data['lq'], flush=True) 39 if log: 40 content = str(timestamp) 41 for key in data_keys: 42 content += ',' + data[key] 43 with open(log_path, 'a') as f: 44 f.write(content + '\n') 45 46 keys = ['time', 'x', 'y', 'z'] 47 x = float(data['x'])/100. 48 y = float(data['y'])/100. 49 z = float(data['z'])/100. 50 values = [timestamp, x, y, z] 51 ed = data['ed'] + ':' + data['id'] 52 # print(timestamp, ed, x, y, z) 53 if ed in sensor_data.keys(): 54 if len(sensor_data[ed][keys[0]]) >= length: 55 for key, value in zip(keys, values): 56 sensor_data[ed][key].pop(0) 57 for key, value in zip(keys, values): 58 sensor_data[ed][key].append(value) 59 else: 60 sensor_data[ed] = {} 61 for key in keys: 62 sensor_data[ed][key] = [] 63 sensor_data[ed]['time'].append(timestamp) 64 sensor_data[ed]['x'].append(x) 65 sensor_data[ed]['y'].append(y) 66 sensor_data[ed]['z'].append(z) 67 68def plot_data1(start_time): 69 keys = ['x', 'y', 'z'] 70 current_node_size = 0 71 plot_dict = {} 72 while True: 73 sensor_data_cp = copy.deepcopy(sensor_data) 74 node_size = len(sensor_data_cp.keys()) 75 if node_size > 0: 76 if current_node_size != node_size: 77 current_node_size = node_size 78 plt.close() 79 fig, axs = plt.subplots(node_size, 1) 80 plot_dict = {} 81 if current_node_size == 1: 82 axs = [axs] 83 for ed, ax in zip(sensor_data_cp.keys(), axs): 84 plot_dict[ed] = {} 85 plot_dict[ed]['ax'] = ax 86 time_array = np.array(sensor_data_cp[ed]['time']) - start_time 87 for key in keys: 88 plot_dict[ed][key], = ax.plot(time_array, sensor_data_cp[ed][key]) 89 ax.set_ylabel(ed) 90 else: 91 for ed in plot_dict.keys(): 92 time_array = np.array(sensor_data_cp[ed]['time']) - start_time 93 if len(time_array) < 2: 94 continue 95 for key in keys: 96 plot_dict[ed][key].set_data(time_array, sensor_data_cp[ed][key]) 97 plot_dict[ed]['ax'].set_xlim((time_array.min(), time_array.max())) 98 plot_dict[ed]['ax'].set_ylim((-3, 3)) 99 # print(len(time_array)) 100 plt.pause(0.05) 101 102def plot_data2(start_time): 103 keys = ['x', 'y', 'z'] 104 current_node_size = 0 105 plot_dict = {} 106 while True: 107 sensor_data_cp = copy.deepcopy(sensor_data) 108 node_size = len(sensor_data_cp.keys()) 109 if node_size > 0: 110 if current_node_size != node_size: 111 current_node_size = node_size 112 plt.close() 113 fig, axs = plt.subplots(node_size, 1) 114 plot_dict = {} 115 if current_node_size == 1: 116 axs = [axs] 117 for ed, ax in zip(sensor_data_cp.keys(), axs): 118 plot_dict[ed] = {} 119 plot_dict[ed]['ax'] = ax 120 time_array = np.array(sensor_data_cp[ed]['time']) - start_time 121 for key in keys: 122 plot_dict[ed][key], = ax.plot(time_array, sensor_data_cp[ed][key]) 123 ax.set_ylabel(ed) 124 else: 125 for ed in plot_dict.keys(): 126 time_array = np.array(sensor_data_cp[ed]['time']) - start_time 127 if len(time_array) < 2: 128 continue 129 for key in keys: 130 plot_dict[ed][key].set_data(time_array, sensor_data_cp[ed][key]) 131 plot_dict[ed]['ax'].set_xlim((time_array.min(), time_array.max())) 132 plot_dict[ed]['ax'].set_ylim((-3, 3)) 133 # print(len(time_array)) 134 plt.pause(0.05) 135 136def main(): 137 try: 138 # twilite2525 139 port1 = port_reader1() 140 port2 = port_reader2() 141 ser1 = serial.Serial(port1, 115200, timeout=1) 142 ser2 = serial.Serial(port2, 115200, timeout=1) 143 144 if log: 145 log_file = open(log_path, 'w') 146 header = 'timestamp' 147 for key in data_keys: 148 header += ',' + key 149 log_file.write(header + '\n') 150 log_file.close() 151 152 twilite1 = Twilite2525AReceiver(ser1, received) 153 twilite1.run() 154 # matplotlib 155 start_time = time.time() 156 plot_data1(start_time) 157 158 twilite2 = Twilite2525AReceiver(ser2, received) 159 twilite2.run() 160 # matplotlib 161 start_time = time.time() 162 plot_data2(start_time) 163 164 except serial.SerialException: 165 print('error:could not open port') 166 exit(-1) 167 168if __name__ == '__main__': 169 args = argv_parser() 170 if args.log: 171 print('-- logging option') 172 log = True 173 if not os.path.exists('.' + os.sep + log_folder): 174 os.mkdir(log_folder) 175 timestamp_str = str(int(time.time())) 176 log_path = '.' + os.sep + log_folder + os.sep + timestamp_str + '-log.csv' 177 main()

補足情報

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

リストを使用することで解決しました。ありがとうございました。

投稿2018/07/20 01:36

CSISC

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ざくっとしかコード見てませんし、他にも修正すべき部分あるかもしれませんが
とりあえず同じsubplotに描画しているようなので、別にする必要はあるかと思います。

Python

1def plot_data1(start_time): 2 # 略 3 fig, axs = plt.subplots(node_size, 1) 4 5def plot_data2(start_time): 6 # 略 7 fig, axs = plt.subplots(node_size, 1) # 2では?

投稿2018/07/09 08:26

can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CSISC

2018/07/09 23:18

早速のご回答ありがとうございます。ご指摘のとおりsubplotを別にしたのですが、グラフは1つしか表示されない状況です。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問