ローカル環境で libreoffice のデータを元にグラフに書くことはできていますが、それをブログでリアルタイムに閲覧することはできません。
なので、作画と同時にサーバーにアップしてそれに対するリンクをブログ記事に書けばいいことに気づきました。
以下のようなデータがあるとします。
これを使ってグラフにします。
import matplotlib.pyplot as pltimport pandas as pdimport matplotlib.dates as mdatesfrom datetime import datetimefrom 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 = 1200DPI = 150WIDTH_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}")
以下のようなグラフができました。
すべてを自動化します。
#!/bin/sh
python ./Diet.pypython ./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
このブログに、生成されアップロードされた画像のリンクを貼ります。
さっきの血圧のグラフは固定されていますが、このグラフは私がローカルで測定するとすぐに反映されるのでこちらはどんどん変化することになります。