血圧と体重を自動提示

(2025-09-06)

ローカル環境で libreoffice のデータを元にグラフに書くことはできていますが、それをブログでリアルタイムに閲覧することはできません。

なので、作画と同時にサーバーにアップしてそれに対するリンクをブログ記事に書けばいいことに気づきました。

血圧を表示する python

以下のようなデータがあるとします。

これを使ってグラフにします。

BP.py
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.dates as mdates
from datetime import datetime
from pathlib import Path
# --- 保存先フォルダとODSファイルパス ---
folder = Path("~/ドキュメント/健康")
ods_file = folder / "health.ods"
# --- 日本語フォントを1種類に統一 ---
plt.rcParams["font.family"] = "Noto Sans CJK JP"
# --- データ読み込み ---
df = pd.read_excel(
ods_file,
engine="odf",
sheet_name="Sheet2"
)
# --- 日付・血圧を数値型に変換 ---
df["日付"] = pd.to_datetime(df["日付"], errors="coerce")
df["最高"] = pd.to_numeric(df["最高"], errors="coerce") # 最高血圧
df["最低"] = pd.to_numeric(df["最低"], errors="coerce") # 最低血圧
# 欠損行を除外し、日付順にソート
df = df.dropna(subset=["日付", "最高", "最低"])
df = df.sort_values("日付")
# --- グラフサイズ設定(横幅1200px固定、dpi=150) ---
TARGET_WIDTH_PX = 1200
DPI = 150
WIDTH_INCH = TARGET_WIDTH_PX / DPI # 1200px / 150dpi = 8インチ
HEIGHT_INCH = 4 # 縦サイズは自由
# --- グラフ描画 ---
fig, ax = plt.subplots(figsize=(WIDTH_INCH, HEIGHT_INCH), dpi=DPI)
ax.vlines(df["日付"], df["最低"], df["最高"], linewidth=1, color="blue")
ax.set_title("血圧推移")
ax.set_xlabel("日付")
ax.set_ylabel("血圧 (mmHg)")
# x軸の日時フォーマット
ax.xaxis.set_major_locator(mdates.AutoDateLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m-%d"))
fig.autofmt_xdate()
ax.grid(axis="y", alpha=0.5)
# --- 自動保存 ---
save_file = folder / f"BP_record.png"
fig.savefig(save_file, bbox_inches="tight", dpi=DPI)
print(f"グラフを自動保存しました → {save_file}")

以下のようなグラフができました。

シェルスクリプトで python を実行し xserver にアップ

すべてを自動化します。

#!/bin/sh
python ./Diet.py
python ./BP.py
scp -r -i ~/.ssh/moheno.key -P 10022 \
~/ドキュメント/健康/BP_record.png \
moheno@sv12345.xserver.jp:~/moheno.xsrv.jp/public_html/jstree/data/health
scp -r -i ~/.ssh/moheno.key -P 10022 \
~/ドキュメント/健康/Diet_record.png \
moheno@sv12345.xserver.jp:~/moheno.xsrv.jp/public_html/jstree/data/health

astro ブログでリンクを貼る

このブログに、生成されアップロードされた画像のリンクを貼ります。

さっきの血圧のグラフは固定されていますが、このグラフは私がローカルで測定するとすぐに反映されるのでこちらはどんどん変化することになります。