最も簡単な折れ線グラフ
ケーナを始めてまだあまり時間が経っていませんが、練習時間を記録しておきたいと思います。
そして、それをグラフで描画したいと思います。
私は windows じゃなくて linux mint なので office ではなくて libreoffice です。
そこに記録したデータを読み込んで python で描画します。
libreoffice に記録してあるデータは、以下のような感じです。

最初にいろいろとインストール。
pip install pandas
pip install matplotlib
pip install odfpy
まずは、線グラフで累積の練習時間をプロットします。
import pandas as pd
import matplotlib.pyplot as plt
class LineP():
def __init__( self ):
self.book = '/home/user/ケーナ練習記録.ods'
self.df = []
self.xs = []
self.ys = []
def readbook(self):
self.df = pd.read_excel(self.book, engine="odf", sheet_name="Sheet1")
def setdata(self):
for eline in self.df.values:
self.xs.append(eline[0])
self.ys.append(eline[3])
def lplot(self):
plt.plot(self.xs, self.ys)
plt.show()
if __name__ == '__main__':
lp = LineP()
lp.readbook()
lp.setdata()
lp.lplot()
結果は、

python の素晴らしさ
python ならあっという間にできると思っていましたが、予想通りでした。
ポイントはいくつかあると思いますが、まずは、たった一行で2次元配列が作成されること。
self.df = pd.read_excel(self.book, engine="odf", sheet_name="Sheet1")
これだけで、すべてのデータが DataFrame という聞き慣れないフォーマットで変数に格納されます。
そうして、DataFrame から一部の変数を抽出するのも一瞬です。
self.df.values
この中から、グラフに描画する変数を配列化してプロットすればグラフが作成されます。
問題は、日付が増えてくると x 軸が混んできて重なる可能性があると思いますが、それはその時考えます。
線グラフと棒グラフを書く
毎日の練習時間と合計の練習時間を棒グラフと線グラフで表します。
最初のプログラムに少し追加するだけでOKです。
import pandas as pd
import matplotlib.pyplot as plt
class LineP():
def __init__( self ):
self.book = '/home/user/ケーナ練習記録.ods'
self.df = []
self.xs = []
self.ys1 = []
self.ys2 = []
def readbook(self):
self.df = pd.read_excel(self.book, engine="odf", sheet_name="Sheet1")
def setdata(self):
for eline in self.df.values:
self.xs.append(eline[0])
self.ys1.append(eline[2])
self.ys2.append(eline[3])
def bplot(self):
plt.bar(self.xs, self.ys1)
def lplot(self):
plt.plot(self.xs, self.ys2, color="red")
plt.show()
if __name__ == '__main__':
lp = LineP()
lp.readbook()
lp.setdata()
lp.bplot()
lp.lplot()
結果は、

でも、これだとY軸の目盛りが一つしかないので、練習時間が100時間とかになると棒グラフはほとんど表示されなくなります。
なので、もう一つのスケールが必要です。
Y軸のスケールを2つ、タイトルなどを表示
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
from matplotlib.font_manager import FontProperties
class LineP():
def __init__( self ):
self.book = '/home/user/ケーナ練習記録.ods'
self.df = []
self.xs = []
self.ys1 = []
self.ys2 = []
self.ax1 = plt.figure().subplots()
def readbook(self):
self.df = pd.read_excel(self.book, engine="odf", sheet_name="Sheet1")
def setdata(self):
for eline in self.df.values:
self.xs.append(eline[0])
self.ys1.append(eline[2])
self.ys2.append(eline[3])
def bplot(self):
self.ax1.bar(self.xs, self.ys1, width=0.3)
def lplot(self):
ax2 = self.ax1.twinx()
ax2.plot(self.xs, self.ys2, color="red")
ax2.set_ylabel('合計(折れ線グラフ)', fontsize = 12)
def show_title(self):
self.ax1.set_title('ケーナ練習時間', fontsize = 14)
self.ax1.set_ylabel('1日(青い棒グラフ)', fontsize = 12)
plt.show()
if __name__ == '__main__':
lp = LineP()
lp.readbook()
lp.setdata()
lp.bplot()
lp.lplot()
lp.show_title()

日本語フォント設定
日本語を設定しないと日本語の文字化けが起こります。
環境は linux mint 21.1 です。
フォントなどをインストール。
sudo apt update
sudo apt install fontconfig
sudo apt install fonts-ipaexfont
「matplotlibrc」を編集すると、python のコード内に設定しなくて済みます。
まずは、「matplotlibrc」の場所を探して、
sudo find / -name matplotlibrc
編集します。
sudo nano /home/mituo/.local/lib/python3.10/site-packages/matplotlib/mpl-data/matplotlibrc
「#font.family : sans-serif」を「font.family : IPAexGothic」に変更します。
残っているキャッシュを削除。
sudo rm ~/.cache/matplotlib/fontlist-v330.json