こんにちは、うさじんです。
前回記事の続きで、作ったデータグラフを整える作業を実施します。
前回記事 【Python】テキストデータを読み込んでグラフを作ってみた【pandas.DataFrame.plot】
前回では最終的に以下のグラフが出力されました。
しかし、細かな軸項目やら目盛り線や、グラフを見やすくする要素が欠けています。
そのため、今回は【Python】を使ったDataFrameのplotについて深掘りしていきたいと思います。
- グラフを見やすくする要素を追加する
- グラフをデータ毎に分割し、グラフ資料として見やすくする
- 他グラフ化手法との比較
上記について検討していきたいと思います。
pandas.DataFrame.plotのグラフを見やすくする
前回記事のコードは以下です。
import pandas as pd #pandasのインポート
import japanize_matplotlib #日本語ライブラリのインポート
#データの1行目を読み込み。
df = pd.read_csv("test_data.csv", skiprows=[1])
#結果確認 1列目を横軸に指定
df.plot(x=df.columns[0])
このグラフでは横軸と縦軸の軸ラベル、目盛り線、グラフタイトルが指定されていません。
また、横軸及縦軸がずれているため、以下のコードで修正しました。
import pandas as pd #pandasのインポート
import japanize_matplotlib #日本語ライブラリのインポート
#データの1行目を読み込み。
df = pd.read_csv("test_data.csv", skiprows=[1])
#結果確認 1列目を横軸に指定
ax = df.plot(
x=df.columns[0], #横軸のデータを指定
figsize=(10,5), #グラフの大きさを指定(横サイズ、縦サイズ、インチ)
grid=True, #補助目盛り線の有無を指定(True,False)
fontsize=15, #目盛りの大きさを指定
xlim=[0, 10], #横軸の範囲を指定(最小値、最大値)
ylim=[-1.5, 1.5] #縦軸の範囲を指定(最小値、最大値)
)
ax.set_title('サンプルデータ 正弦波', size= 15) # タイトルの設定
ax.set_xlabel('Time[sec]', size=15) # 横軸ラベルの設定
ax.set_ylabel('Gain[-]', size=15) # 縦軸ラベルの設定
実行結果
大分見やすくなりましたね。
グラフの要素に係る部分はコードの8行目以降が該当箇所となります。
今回のデータについて、有効なグラフ設定が必要であったのは次の9箇所のみとなりました。
- 横軸データの選択(縦軸については自動ですべて選択、個別選択も可能)
- グラフの大きさの指定(グラフの大きさを指定(横サイズ、縦サイズ、インチ)
- 補助目盛り線の有無を指定(大きさの範囲も指定可能)
- 横軸・縦軸の範囲を指定(最小値、最大値)
- タイトルの指定
- 横軸・縦軸ラベルの指定
ただし、設定できない箇所も存在しました。
それは複数グラフを並べたときの軸ラベル設等でした。
グラフをデータ毎に分割し、グラフ資料として見やすくする
前項では4種のデータを一つのグラフ内に納めた状態でグラフを整えましたが、
本項ではグラフをデータ毎に横並びにして、グラフ資料として出力できるかを検討してみました。
方法としては【Python】の【pandas.DataFrame.plot】で設定可能な範囲についての検討です。
また、前回記事のグラフデータ資料を作ることを目標としました。
まず、結論として、前回記事のグラフデータ資料に近い結果を得ることは出来ました。
しかしながら、資料の内容にいくつか課題も見つかりました。
最終的に完成したコードとグラフ資料は以下となります。
import pandas as pd #pandasのインポート
import japanize_matplotlib #日本語ライブラリのインポート
#データの1行目を読み込み。
df = pd.read_csv("test_data.csv", skiprows=[1])
df_r= df.rename(columns={'Unnamed: 0':'Time[sec]'})
print(df_r)
#結果確認 1列目を横軸に指定
ax = df_r.plot(
x=df_r.columns[0],
figsize=(10,18), #2✕2の場合は(20, 9)
subplots=True,
layout=(4,1), #2✕2の場合は(2, 2)
sharey=True,
sharex=False,
grid=True,
title='サンプルデータ 正弦波',
fontsize=15,
xlim=[0, 10],
ylim=[-1.5, 1.5]
)
実行結果
.plotの()内の引数で、subplots=Trueとすれば、複数グラフでの描画が有効となります。
しかしその場合、前項で示した、ax.set_titleやax.set_xlabel(もしくはax.set_ylabel)は使用出来ません。
よって、コードでは以下の修正が必要でした。
- 横軸の軸ラベルを事前に変更すること →8行目が該当
- タイトルの引数を設定すること →20行目が該当
- 縦軸の軸ラベルの設定ができないこと
subplotで調整可能な引数を以下に示します。
設定 | 引数 | |
各データのサブプロットの有効化 | subplots | True:有効化 False(デフォルト):無効化 |
サブプロットのレイアウト調整 | layout | 数値で調整 layout=(縦個数, 横個数) |
サブプロット間の軸スケールの共有 | sharex sharey |
True:有効化 False(デフォルト):無効化 |
今回のデータであればCSVデータ1列目を横軸としたため、
subplotsを有効にすると自動的に残りの4列のデータが個別グラフ化されました。
pandas.plotと他のグラフ化手法の比較
今回、pandas.plotをある程度検討したことで、他のグラフ化手法との比較を検討してみました。
【Python】の【matplotlib】との比較
【pandas.DataFrame.plot】は手っ取り早くプロットしたい場合には重宝する手法です。
しかし、より複雑なグラフを作成したい場合や、見栄えを重視し、確りと設定したい場合はmatplotlibのようなグラフライブラリが必要であると感じました。
その分matplotlibについての理解も必要であるため、
matplotlibについての検討は次回の記事で行いたいと思います。
【Excel】との比較
グラフ資料作成の柔軟性は、【Excel】に軍配が上がります。
MicrosoftOfficeはたいていどのPCにもインストールされており、Pythonと比較すると敷居が低いです。
グラフの設定項目もなかなかどうして痒いところに手が届くため、万人受けするのは【Excel】が間違いないと感じました。
しかし、Pythonとpandas.plotに扱いが慣れたエンジニアにとっては
データのグラフ化は【pandas.DataFrame.plot】が迅速に分析ができるのではないかとも感じます。
現場における迅速なデータ評価は重要な項目の一つであるため、
データ分析フォーマットが完成したpandas.plotは大きな要素になると思いました。
以上が、【pandas.DataFrame.plot】を使ってデータをグラフ化してみたということになります。
改めてDataFrameやplot のあれこれを調べることで、自分のデータの取り扱いに幅が広がったように感じます。
今後もこのような記事を通して、さらなる成長につなげたいと思いました。
それではまたよろしくお願い致します。