android studio初心者が canvasを使ってPFCバランスグラフを自作してみました。作図の座標の考え方は VBAでも応用できる。PFC栄養グラフで透析治療に役立つのだ。

androidアプリ
この記事は約14分で読めます。

PFCバランスとは

PFCバランスとは、摂取カロリーのうち三大栄養素の「P=たんぱく質」「F=脂質(脂肪)」「C=炭水化物」がどれくらいの割合を占めるかを示した比率のこと。このPFCバランスを整えることによって極端な栄養の偏りを防ぎ、栄養バランスを整えながら健康的にダイエットすることができるのです。厚生労働省では「エネルギー産生栄養素バランス」として、生活習慣病の予防・改善の指標となる三大栄養素の目標量を、以下の通り提示しています。

たんぱく質:13~20%
脂質:20~30%(飽和脂肪酸は7%以下とする)
炭水化物:50~65%

https://melos.media/wellness/ から引用

一般的なPFCグラフの形状

   

PFCグラフ作成の経緯

鮎斗君のお父さんは現在透析治療中で週4回、一回6時間の透析中です。愛機XPS13でベッドでアプリ制作にいそしんでいます。

透析治療では体重管理が非常に重要です。

飲んだ水や食べ物に含まれる水分は普通は「おしっこ」として排出されますが、私の場合は腎臓機能が完全に失われているため一滴の尿も出ません。体内に入った水分はそのまま「むくみ」として蓄積されます。当然生きるために食物を摂取した分の重さがは、前回透析終了直後の体重と今回透析開始前の体重差がその食物と水分の重さとして残るのです。

透析治療では具体的には、人工腎臓で血液中の有害物質を取り除くと同時に体に蓄積した水分を取り除く(除水)をします。

体重の増加率は通常ドライウエイト(標準体重)の 3~5%と言われていて、例えば、ドライウエイト63㎏(医師の指示)の場合、5%増加すると66.15kgでその差3.15㎏ですから、私の場合、栄養になる分と大便として排出される分を除いても約2.5㎏を水分とみて除水することになります。

何が辛いかといえば、この除水が非常につらい治療です。除水量がいつも一定していればいいのですが、時には前の晩少し食べすぎたり、ビールを飲みすぎたりすると当然その分の水分量が増えすぎてしまいます。除水量が3㎏を超えると透析治療中に血圧の急激に降下して、(私の場合80以下になることもある)体調が著しく悪化します。

そうした場合、血圧の上昇させるため、逆に血液中に蒸留水を注入したり、除水を停止したりします。

その結果、体調は徐々に回復しますが、透析治療終了時の体重がドライウエイトに戻らず増加した分の水分が体内に残ることになります。

当然、そうなると次回の透析までの間に摂取できる食事量をより少なくしなければなりません。それができなければ、除水しきらないで残る水分量がどんどん多くなってしまいます。

そこで、私の場合は自作したアプリで食事の摂取状況を逐一記録し体重の増加をグラフで見える化し摂取量を管理し自制しているのです。そこで心配になるのが食事量を抑える分カロリー不足や栄養不足にならないか、ということです。ここで今回自作したPFCバランスグラフの登場です。

下図  左、PFCグラフ  中央、食事の摂取記録画面   右、血圧グラフ

PFCバランスグラフの構造

栄養摂取状況記録

自作した食事管理アプリでは文部科学省のホームページで公開している栄養成分表を使ってSQLiteデータベースに摂取状況を記録蓄積しています。日付単位で3食ごとに摂取量を管理し摂取総カロリー(熱量)に対するタンパク質、脂質、炭水化物がそれぞれから発生する熱量に換算した値の割合をグラフに表現することになります。

図1

  • 上図Оを中心とした円に内接する 正三角形PFCを描きます。
    正三角形P、F、Cの各頂点から円の中心を通る線が下の直線になります。
    直線P-О タンパク質(protein:P
    直線F-О 脂質(fat:F
    直線C-О 炭水化物(CarbohydrateC
    この3本の直線がそれぞれの栄養素の実質摂取エネルギー値の大きさを表します。この三本の直線は円の中心Oから放射状に配置していてそれぞれ120°になって固定しています。それぞれの直線の中心点から円と接する点までが目標とする栄養素の摂取エネルギーの大きさです。各摂取した栄養素が持っているエネルギー量を計算するため以下の定数を使用します。
    タンパク質ーーー4kcal(目標エネルギー比率 20%)
    脂質------9kcal(目標エネルギー比率 30%)
    炭水化物----4kcal(目標エネルギー比率 65%)

    この定数を使って計算すると下記の様になります。
    例:摂取した総カロリー2000Kcal
    タンパク質70g、脂質60g、炭水化物350gだったとした場合
    タンパク質エネルギー 70g×4kcal=280kcal 比率 280kcal÷2000kcal=14%
    脂質エネルギー 60g×9kcal=540kcal    比率 540kcal÷2000kcal=27%
    炭水化物エネルギー 350g×4kcal=1400kcal 比率 1400kcal÷2000kcal=70%上記の計算で得た値の状況を各栄養素の直線上に描画していきます。例えば図1の炭水化物(直線O-C)を見たとき
    円と接するC点までの長さがエネルギー比率が65%だった時の長さですから上の例では2000kcal×0.70=1400 でしたから直線(O-C)の長さが1300kcalを表していて、実際摂取量は1400kcalだったわけですから直線(O-C)上のC点を少し過ぎたC’が位置する点までがこの例の炭水化物のエネルギー量の長さになります。この状況をcanvas上に描画するとき、この少し過ぎたあたりのC’がどこに位置するのかの座標を計算し割り出さなければなりません。そこで次のことを理解します。図1の直線と破線を含む(O-C’)を斜辺とする三角形(O、C’、P”)を見てください。ここにできる三角形は必ず30°60°90°の特別な直角三角形になります。
    三平方の定理のうち30°60°90°の特別な直角三角形の3辺の長さの比は1:2:√3になるという特性を利用するとC’点の座標位置を計算できます。
上記の三平方の定理を使って計算すると、直線ОーC’の長さはが分っているので
直線OーP’’の長さは(直線O-C’)÷2
直線C’ーP’’の長さは(直線O-C’)÷2×√3となります。
androidのcanvasの上に描画するC’点の座標がわかるのです。

座標位置の理解

上記の状況を具体的にcanvas上にグラフの図形としてに表すため、各データを座標系の値に変換します。

  • 例:【実際に摂取した総カロリー2000Kcal】
    タンパク質70g、脂質60g、炭水化物350gだったとした場合炭水化物----4kcal(目標エネルギー比率 65%)
    タンパク質エネルギー 70g×4kcal=280kcal 比率 280kcal÷2000kcal=14%
    脂質エネルギー 60g×9kcal=540kcal    比率 540kcal÷2000kcal=27%
    炭水化物エネルギー 350g×4kcal=1400kcal 比率 1400kcal÷2000kcal=70%

図1の場合上記の計算から、

【目標とする値】
直線O-Cの長さ=炭水化物の目標とするエネルギー量で、総カロリーの65%だから1300kcal
直線O-Cの長さを座標で表すと、円の半径と同じですから300ピクセル

【実際の値】
直線O-C’の長さ=炭水化物の実際摂取量をエネルギー量は2000kcaの70%で1400Kcal
・直線O-C’の長さ=を座標で表す値x(求める値)

  • 上記の関係を比例式で表すと
    1300:300 = 1400:x
    ∴(すなわち)外項の積と内項の積は等しいので
    1300x = 1400×300
    x = 1400×300÷1300
    x ≒ 323.1

結果、直線O-C’の座標の直角三角形の斜辺の長さ≒323.1です
これを今度はcanvas上のC’座標点に変換します

その前に座標の原点を移動します。
通常座標原点は
canvasの左上が(0,0)になっていますが、ここでは円の中心である座標x=600、座標y=600(上から600p左端から600)にします。
具体的には
translate(600, 600)で円の中心О(オー)が示す座標に原点移動します。
上記から、直線O-C’は座標上の斜辺の長さで323.1となったわけですから、ピタゴラスの定理から点C’の座標位置は
座標x(O-P”)=323.1÷2≒161.6
座標y(C’-P”)=323.1÷2×√3≒279.8となります。つまり円の中心O(オー)がcanvas原点になったのでC’座標(‐279.8, 161.6)となるわけです。

値を返すメソッド(関数)を作る。

斜辺(O-C’)の長さ(実際に摂取した栄養素の量)を引数にして上記の計算結果のx座標とy座標の値を配列にして返すメソッドを作っておけば処理が簡単になります。

下記はアプリで実際に使ったメソッドです。

次は資質を表すO-F(脂質)です。
考え方は炭水化物のO-Cと全く同じです。ここにできる三角形はO-Cの時とは逆向きなのでX座標の値は(+)プラスになります。

  • 例:【実際に摂取した総カロリー2000Kcal】
    タンパク質70g、脂質60g、炭水化物350gだったとした場合脂質------9kcal(目標エネルギー比率 30%)
    タンパク質エネルギー 70g×4kcal=280kcal 比率 280kcal÷2000kcal=14%
    脂質エネルギー 60g×9kcal=540kcal 比率 540kcal÷2000kcal=27%
    炭水化物エネルギー 350g×4kcal=1400kcal 比率 1400kcal÷2000kcal=70%

 

直線O-Fの長さ=脂質の目標とするエネルギー量で、総カロリーの30%だから600kcal
直線O-Fの長さを座標で表すと、円の半径と同じですから300ピクセル

・脂質の実際摂取量をエネルギー量に換算した値は総カロリーの27%で540Kcal
・求める長さ=座標で表す値 X(求める値)

  • 上記の関係を比例式で表すと
    600:300 = 540:x

    600x = 540×300
    x = 540×300÷600
    x ≒ 270
    となります。

結果、直線O-Fの座標の直角三角形の斜辺の長さ≒270です
これを今度はcanvas上のC’座標点に変換します

その前に座標の原点を移動します。
通常座標原点は
canvasの左上が(0,0)になっていますが、ここでは円の中心である座標x=600、座標y=600(上から600p左端から600)にします。
具体的には
translate(600, 600)で円の中心О(オー)が示す座標に原点移動していますから。
つまり、直線O-Fは座標上の斜辺の長さで270 となったわけですから、ピタゴラスの定理から求める点F’の座標位置は
座標x(O-P”)=270÷2≒135
座標y(F’-P”)=270÷2×√3≒ 233.8となります。つまり円の中心O(オー)がcanvas原点になったのでF’座標(233.8, 135)となるわけです。
【注意点】
脂質と炭水化物とは中心Оから見ると反対側ですから炭水化物のX座標はマイナス
脂質のX座標はプラスになることです。
最後に、タンパク質の直線 O-Pです。O-Pは垂直線なので、棒の長さがそのまま座標になるので三角形の計算は必要ないので簡単です。
  • 例:【実際に摂取した総カロリー2000Kcal】
    タンパク質70g、脂質60g、炭水化物350gだったとした場合タンパク質ーーー4kcal(目標エネルギー比率 20%)
    タンパク質エネルギー 70g×4kcal=280kcal 比率 280kcal÷2000kcal=14%脂質エネルギー 60g×9kcal=540kcal 比率 540kcal÷2000kcal=27%
    炭水化物エネルギー 350g×4kcal=1400kcal 比率 1400kcal÷2000kcal=70%

 

直線O-Pの長さ=タンパク質の目標エネルギー量、総カロリーの20%で400kcal
直線O-Pの長さを座標で表すと、円の半径と同じですから300ピクセル

・タンパク質の実際摂取量をエネルギー量に換算した値は総カロリーの14%で280Kcal
・求める長さ=座標で表す値 X(求める値)

  • 上記の関係を比例式で表すと
    400:300 = 280:x

    400x = 280×300
    x = 280×300÷400
    x ≒ 210
    となります。

結果、直線O-Pの長さ≒210です
これを今度はcanvas上のC’座標点に変換します

つまり、直線O-Pは垂直線ですから、求める点P’の座標位置は
座標x(O-P”)=中心Oから見て 0(ゼロ)
座標y(直線の長さその物)=210となります。つまり円の中心O(オー)がcanvas原点になっているので求めるP点座標(0, 210)となるわけです。
【注意点】
中心Оから見るとY軸の上方側ですからY座標はプラスになることです。

もうちょっとわかりやすく

もう少し整理してみます

イメージ① 理想的に(目標にする)摂取したい栄養

【エネルギー換算係数】

食べた食品中に含まれる数々の栄養素の内タンパク質、脂質、炭水化物の3種類についてその摂取重量をそれぞれエネルギー値(熱量値)に変換する必要があります。

例えば、摂取したタンパク質が30gだったとしたらこれが体内で燃えてエネルギーになると熱量値は 30g×4kcal=120kcal となります

この 4kcal が換算係数です。脂質は9kcal、炭水化物は4kcalになっています。

これで計算した熱量値が理想的なエネルギー比になったとき下図の円グラフはその円に内接する正三角形になりますから、これに比較することで実際の栄養のバランスを見ることができるのです。

 

イメージ② 実際の栄養摂取の状況

下図は、例として実際に食べた食事の栄養状況を表しています。

見やすくするために、若干データを誇張しています。

下図の場合では、タンパク質、炭水化物は目標値(理想値)に達せず。脂質は摂取過多になっています。

つまり、もう少し高タンパクでかつ低脂肪の食品を摂取したいということをこのグラフから見て取ることができます。

 

イメージ③ 作図に必要な座標の計算方法(炭水化物の場合)

【作図のためのポイント】

ポイントは二つ

  • 比例式    摂取したエネルギー値を計算

炭水化物の目標とするエネルギー値 対 との大きさを表す図形上の長さ の割合から

実際に摂取したエネルギー値 を表す図形上の長さを計算します

目標とするエネルギー値図形上の目標の長さ実際に摂取したエネルギー値X

比例式では、内項の積と外項の積は等しいという性質を利用してXを計算します

ですから

    目標エネルギー値×X  図形上の目標の長さ×実際に摂取したエネルギー値となり

すなわち

X  図形上の目標の長さ×実際に摂取したエネルギー値÷目標エネルギー値

  • 三平方の定理  摂取したエネルギー値を直角三角形の斜辺として計算

前項で計算したXは炭水化物のエネルギー値作図上の長さに変換した値で、このXを

特別な直角三角形(30°、60°、90°)の斜辺として、他の辺の長さを計算すると

三平方の定理 特別な直角三角形の辺の長さの比1:2:√3 から

その他辺の横線が斜辺の終点x座標、縦線が斜辺の終点のy座標となります。

特別な直角三角形として計算して作図した斜辺はx座標軸に対して30°の直線になります。

また、円の中心O(オー)を原点座標(0,0)として作図すると円の中心から120°で3等分した直線ができます。

 

イメージ④ 作図の方法(脂質)

具体的な作図の方法の考え方はイメージ③炭水化物の時と全く同じです。

違うのは、計算した結果のx座標の向きが逆になるだけです。

円の中心O(オー)を原点座標にしていますから、炭水化物は中心Oから左方向でx座標はマイナスで、脂質はプラスにします。

 

イメージ⑤ 作図の方法(タンパク質)

作図の方法は前項の炭水化物、脂質と考え方は同じです。

が、タンパク質のエネルギー値を表す直線は垂直線なので三平方の定理の計算は必要ありません。

比例式で計算した値がそのままy座標にあてはめますから、y座標にマイナスをつければ終わりです(円の中心が原点座標なのでx座標は0ゼロです)

 

座標の使われ方

座標計算が必要なわけ。

androidでCanvasを利用して作図するときは、その作図メソッドの引数に始点と終点の座標を指定する必要があります。

 

まとめ

どうだったでしょう。長々と書いてきましたが、中学生程度の数学で作図できましたので、もっと簡単な描き方もあるのでしょうがとりあえずデータを見える形にできましたので、android初心者としてはこれで上出来とおもいます。

現在はこのアプリを利用して、透析治療のツールとして毎日データを蓄積しながら順調に体調管理に利用しています。

超初心者ではありますが、プログラミングはボケ防止にも大変役立つものだと思いますので、これからも様々挑戦してみたいと思います。

透析治療の日々、ベッドでゲーミングキーボードをたたくカタカタ音が好きで何台もキーボードを買いましたが、最近そのカタカタ音は他の人に迷惑をかけているかもしれないことに気づいて、今は静音タイプのキーボードに変えました。透析導入のとき買ったXPS13が8年たって寿命を迎え、つい最近ASUSのZenBookに買い替えしました。8年前に16万円で買ったCPU i7、250SSD 当時としては爆速ですごいなあと思ったのですが、今回はランクを落として10万でCPU i5を買いました。SSDは倍の500Gとなり顔認証もついていて、起動してみると前のに比べて更に超爆速になっていました。技術革新の高さに驚かされました。今は67になりましたからパソコンを買うのはこれが最後かもしれないけど、それでも毎日カタカタやっていきます。

初心者ですが、少しでもこの記事がより初心者の方の理解の助けになれば幸いです。

コメント

タイトルとURLをコピーしました