スクリプトのお勉強 技術

seaborn + Pandas + Python によるグラフ描画(その2: グラフ描画編)

投稿日:

前回の続き

前回の続きです。

折れ線グラフ

まずは折れ線グラフを描画したいと思います。

描画するのは以下です。

  • 運用商品(4つ)
  • 日経平均

以下で起動します。引数(dataset-2017-20190812)は、運用商品のデータ(CSV)が入っています。

$ pipenv run python3 seaborn_graph_with_nikkei.py dataset-2017-20190812/

折れ線グラフ(seaborn_graph_with_nikkei.py)の中心処理が以下です。

plt.figure()
# グラフ描画
for product_name in ['三井住友・DC外国リートインデックスファンド',
                     '三菱UFJDC新興国債券インデックスファンド',
                     'iFree 8資産バランス',
                     'DCニッセイ日経225インデックスファンドA']:
    set_df_graph(product_name, adf)
nikkei_df = get_nikkei_df()
sns.lineplot(x=nikkei_df['x'], y=nikkei_df['y'], label='日経平均')

# グラフ設定
ax = plt.gca()
ax.set(xlabel='基準日[年-月]', ylabel='基準価額[円]')

# 余白設定
plt.subplots_adjust(top=0.95, right=0.95, bottom=0.37)
# 凡例を外側に設定
plt.legend(bbox_to_anchor=(0, -0.18), loc='upper left',
           borderaxespad=0, fontsize=11)

plt.savefig("seaborn_graph_with_nikkei.png")
plt.close('all')

以下で各折れ線グラフを描画しています。

sns.lineplot(x=nikkei_df['x'], y=nikkei_df['y'], label='日経平均')

画像の上下左右を変更したり、凡例を下に置く設定が以下です。

# 余白設定
plt.subplots_adjust(top=0.95, right=0.95, bottom=0.37)
# 凡例を外側に設定
plt.legend(bbox_to_anchor=(0, -0.18), loc='upper left',
           borderaxespad=0, fontsize=11)

画像は以下です。

seaborn 折れ線グラフサンプル

面グラフ(Area Chart)

折れ線グラフに加え、線に囲まれたところを色付けするグラフです。
積み上げグラフ(stackgraph)との違いは、データを合計するかしないか、が違います。

ここでは単なる面グラフを描画します。あと、凡例(Legend)に平均等を表示を追加しました。

描画するのは、運用商品(4つ)にしました。日経平均を描画してしまうと、
全部埋まってしまいそうなので割愛しました。

面グラフのサンプル(seaborn_area_chart_with_outlegend.py)の中心処理が以下です。

plt.figure()
# グラフ描画
product_names = ['三井住友・DC外国リートインデックスファンド',
                 '三菱UFJDC新興国債券インデックスファンド',
                 'iFree 8資産バランス',
                 'DCニッセイ日経225インデックスファンドA']
product_dt = None # 基準日
product_prices_df = pd.DataFrame()
# (1)
for product_name in product_names:
    # 各columnの商品名毎のデータを取り出す
    product_df = get_df_graph(product_name, adf)
    # 基準日を設定する
    if not '基準日' in product_prices_df.columns:
        product_prices_df['基準日'] = product_df['基準日'].values
    product_prices_df[product_name] = product_df['基準価額'].values

# print(product_prices_df.head())
# 以下データ
#   三井住友・DC外国リートインデックスファンド  三菱UFJDC新興国債券インデックスファンド  iFree 8資産バランス  DCニッセイ日経225インデックスファンドA        基準日
#   0                 11393.0                 13578.0         12001.0                 14076.0 2018-01-10
#   1                 10130.0                 13111.0         11372.0                 12591.0 2018-03-30
#   2                 11096.0                 12114.0         11453.0                 13269.0 2018-06-29
#   3                 11063.0                 13149.0         11312.0                 11661.0 2017-09-18
#   4                 10680.0                 12159.0         11252.0                 12243.0 2019-01-13
# 基準日をx軸にして、stackしない設定。
# stackとは、積み上げグラフを指す
# (2)
product_prices_df.plot.area(x='基準日', stacked=False)

# グラフ設定
ax = plt.gca()
ax.set(xlabel='基準日[年-月]', ylabel='基準価額[円]')

# 余白設定
plt.subplots_adjust(top=0.95, right=0.95, bottom=0.50)
# 凡例を外側に設定
lg = plt.legend(bbox_to_anchor=(0, -0.38), loc='upper left',
           borderaxespad=0, fontsize=11)
# (3)
for lg_text in lg.get_texts():
    text = lg_text.get_text()
    mean = product_prices_df[text].mean()
    min = product_prices_df[text].min()
    max = product_prices_df[text].max()
    lg_text.set_text(text + "\nmean:{} min:{} max:{}".format(mean, min, max))
plt.savefig("seaborn_area_chart_add_legend.png")
plt.close('all')

上記は以下の処理を行っています。

  • (1) グラフ用DataFrame生成
  • (2) 面グラフ描画
  • (3) 凡例に平均値追加

特に、(2) 面グラフをどう描画するのか、いろいろ調査した結果、こうなりました。 積み上げグラフならば、stackplotとかもあるようです。

起動方法は以下です。

$ pipenv run python3 seaborn_area_chart_with_outlegend.py dataset-2017-20190812/

画像は以下の通りです。

おわりに

途中少し詰まることもありましたが、思ったよりあっさりと描画できました。
仕事に生かしていきたいと思います。

参考

  • MatplotlibのAPI
     https://matplotlib.org/3.1.1/api/legend_api.html
  • savefigの解像度設定
    https://codeday.me/jp/qa/20190122/143899.html
  • area chartの例
    https://python-graph-gallery.com/254-pandas-stacked-area-chart/
  • seabornの基礎。図解されていてわかりやすい
    https://towardsdatascience.com/a-step-by-step-guide-for-creating-advanced-python-data-visualizations-with-seaborn-matplotlib-1579d6a1a7d0
  • seabornの凡例操作方法
    https://stackoverflow.com/questions/47542104/how-to-control-the-legend-in-seaborn-python
    https://qiita.com/matsui-k20xx/items/291400ed56a39ed63462
  • area chart出力方法
    https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.area.html
  • エラー出力の参考
    https://nextjournal.com/blog/plotting-pandas-prophet
  • seabornの見た目調整
    https://qiita.com/skotaro/items/7fee4dd35c6d42e0ebae

-スクリプトのお勉強, 技術

執筆者:

関連記事

Vue.js 導入編

1.はじめに 近年、web関係で「クライアントサイドJavaScript」というのがトレンドになっているそうです。 「クライアントサイドJavaScript」と、従来のWebアプリケーションとの違いは …

新規プロジェクト参入時に考えること

派遣における労働条件 就業予定時間(変形労働時間やフレックスタイム制の適用を含む)残業の有無と量就業場所(交通ルート、オフィスの配置等)業務の継続予定期間 制服の有無 (背広かどうか)福利厚生施設の有 …

SPAMチェック for OCN の開発

前回、Thunderbirdプラグインの概要を書いたので、今回は開発したプラグインについて書きます。 SPAMチェック for OCNとは 以下の機能を持ったThunderbirdのアドオン(プラグイ …

リモート実家帰りしてみる

このご時世、実家には直接帰れないけど、1月には一応実家帰り的な感じでリモート実家帰りをしようかと思いました。 リモートは大変。。 一応実家には自分で設置したインターネットや無線LANがあるので、Zoo …

PythonでPKCS#12を使用して暗号/復号する

1. はじめに 仕事でVPN関係のシステム開発をすることになりました。まずは暗号機能の基本を思い出すため、Pythonで、PKCS#12の公開鍵で暗号、秘密鍵で復号するプログラムを作ってみようと思いま …