【Python】グラフの形を整えてみた【panda.DataFrame.plot】

 

こんにちは、うさじんです。
前回記事の続きで、作ったデータグラフを整える作業を実施します。

前回記事 【Python】テキストデータを読み込んでグラフを作ってみた【pandas.DataFrame.plot】

前回では最終的に以下のグラフが出力されました。
しかし、細かな軸項目やら目盛り線や、グラフを見やすくする要素が欠けています。
そのため、今回は【Python】を使ったDataFrameのplotについて深掘りしていきたいと思います。

  1. グラフを見やすくする要素を追加する
  2. グラフをデータ毎に分割し、グラフ資料として見やすくする
  3. 他グラフ化手法との比較

上記について検討していきたいと思います。

 

うさじん
pandas.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])
実行結果
図A 実行結果 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)     # 縦軸ラベルの設定

実行結果

図B 実行結果 ax = df.plot

大分見やすくなりましたね。
グラフの要素に係る部分はコードの8行目以降が該当箇所となります。
今回のデータについて、有効なグラフ設定が必要であったのは次の9箇所のみとなりました。

  1. 横軸データの選択(縦軸については自動ですべて選択、個別選択も可能)
  2. グラフの大きさの指定(グラフの大きさを指定(横サイズ、縦サイズ、インチ)
  3. 補助目盛り線の有無を指定(大きさの範囲も指定可能)
  4. 横軸・縦軸の範囲を指定(最小値、最大値)
  5. タイトルの指定
  6. 横軸・縦軸ラベルの指定

ただし、設定できない箇所も存在しました。
それは複数グラフを並べたときの軸ラベル設等でした。

 

グラフをデータ毎に分割し、グラフ資料として見やすくする

前項では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]
    )

実行結果

図C グラフデータ資料1 4✕1
図D グラフデータ資料 2✕2
図E グラフデータ資料 1✕4

 

 

.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 のあれこれを調べることで、自分のデータの取り扱いに幅が広がったように感じます。

今後もこのような記事を通して、さらなる成長につなげたいと思いました。
それではまたよろしくお願い致します。