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

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

ただいまの
回答率

90.49%

  • Python 3.x

    6432questions

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

  • Matplotlib

    312questions

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

  • IoT

    56questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 357

CSISC

score 2

 前提・実現したいこと

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

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

 発生している問題

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

 該当のソースコード

# -*- 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ページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

def plot_data1(start_time):
                # 略
                fig, axs = plt.subplots(node_size, 1)

def plot_data2(start_time):
                # 略
                fig, axs = plt.subplots(node_size, 1) # 2では?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/10 08:18

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

    キャンセル

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

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Python 3.x

    6432questions

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

  • Matplotlib

    312questions

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

  • IoT

    56questions

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