2
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

matplotlib 2軸グラフ ①データ生成編

はじめに

二軸グラフをpandasで奇麗に描画する方法がわからず、無限に時間を溶かしました
奇麗な二軸グラフの描画に悩む方がこの記事を参考にしていただければ幸いです

概要

時間軸のフォーマットが異なる二つのCSVデータを合成し、同じ描画エリアに二軸グラフのプロットを行ないます

構成

実在するセンサデータを使用すると怒られそうなのでデータを作るところから行います
全部で3部構成です

今回は「①データ生成編」です
使用するコードは以下に載せてあります
https://github.com/ozikot/BiaxialPlot/tree/master/ep1_generate

データ生成

二つのCSV形式のデータを作成します
異なるセンサから取得したセンサデータ、という設定です
以下にそれぞれのセンサデータの内容を示します

※あくまで模擬データです 実在するセンサ、センサデータとは関係ありません

  • 心拍
    • Time('YYYY/MM/DD hh :mm : ss')
      • 例) 2018年11月12日13時31分20秒 -> 2018/11/12 13:31:20
    • BPM
      • 例) 100 -> 100 (そのまま)
  • 体表温度
    • Time(センサ取得日の0時0分を0とした経過時間) [μs]
      • 例) 13時31分20秒 -> 48680000000
    • Temperature [10-1 °C]
      • 例) 25.4度 -> 254

心拍データの生成

まず最初に心拍データを生成します
初期値100で幾何ランダムウォークを用いました
以下の記事を参考にさせて頂きました

Pythonでランダムウォーク

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 生成するデータの行数
ds = 30000

# 幾何ランダムウォークで疑似的な心拍データの生成
dn = np.random.choice([-1, 1], size=ds)
p0 = 100   # 初期値は100
gwalk = np.cumprod(np.exp(dn * 0.001)) * p0
pd.Series(gwalk).plot()

# データフレームを生成
df = pd.DataFrame({
    'Time' : pd.date_range('2018/09/01 00:00:00', periods=ds, freq='1S'),
    'BPM' : pd.Series(gwalk)
})

# データフレームをCSVファイル形式で保存
df.to_csv('..//csv_file//heartbeat.csv')

グラフを描画してみます
heartbeat.png

いい感じですね
同じ要領で体表温度のデータを生成します

体表温度データの生成

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 生成するデータの行数
ds = 30000

# 幾何ランダムウォークで疑似的な体表温度データの生成
dn = np.random.choice([-1, 1], size=ds)
p0 = 20   # 初期値は20度
gwalk = np.cumprod(np.exp(dn * 0.001)) * p0
pd.Series(gwalk).plot()

# データフレームを生成
df = pd.DataFrame({
    'Time' : pd.Series([i * 1000000 for i in range(0, ds)]),
    'Temperature' : pd.Series(gwalk)
})

# データフレームをCSVファイル形式で保存
df.to_csv('..//csv_file//temp_bs.csv', index=None)

グラフを描画してみます
temp_bs.png

適当なところを拡大してみると、数値の遷移量がランダムになっており模擬データとしては十分だという事がわかります
キャプチャ.JPG

おわりに

いかがでしたでしょうか
何かありましたらコメントかTwitter(https://twitter.com/ozikot) にて教えてください!
次回は今回作成した二つのデータを一つのデータに合成します

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
2
Help us understand the problem. What are the problem?