【初心者】matplotlibによる図の作成方法_1

スポンサーリンク
Python




仕事でデータをあつかうことがあります。そのデータをグラフ化する方法はいくつかありますが、やはりエクセルを使うことが多いと思います。エクセルでも問題なく作成できるますが、ここではPythonのmatplotlibを使った方法をみていきましょう。

なぜなら、matplotlibを使う利点があるからです。以下に示します。

  • かっこいいグラフが作れる
  • 短時間で図ができる

センスによっては、かっこよく、エクセルではできないグラフが作れます。また、一度グラフを作成するコード書くと、そのコードを実行するだけで2回目以降のグラフの作成が短時間でできます。多少はコードの調整が必要な場合がありますが、グラフ作成の時間短縮につながります。

今回は最終目標である図を示します。

その図を作成するための手順を分かりやすく説明していきます。

以下の説明はAnacondaでのJupyter Labを使っています。環境設定構築についての過去記事がありますでの、参考にして下さい。

【2020年最新】Anacondaのインストール方法

最終目標

店舗ごとの業績を時系列でグラフ化しました。

わたしはセンスがないですが、悪くはない図ではないでしょうか。

それでは、この目標に向かってやっていきましょう!

必要なライブラリ―をインポート

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')

データを作成する

a=pd.DataFrame([[70,95],
               [75,92],
               [72,89],
               [77,85],
               [100,81],
               [108,83],
               [115,84]],
               index=['4月','5月', '6月','7月','8月','9月','10月'],
               columns=['A', 'B'])
a

出力:

こんなデータフレームの表が出力されます。indexは縦の名前、columnsは横の名前です。図を作成するときは、エクセルでも同じような表を作成すると思います。

これは、業績結果をイメージして、A店とB店の各月の売り上げの表を作成しています。

自身でも同じようなデータであれば、微調整で使用できるコードだと思います。

matplotlibで図を作成する

plt.plot(a)
plt.show()      # なくてもいいけど、慣例的に書く
コード内にある  #  はコメントアウトで、コードに関係ないです。コードの説明を書いて、分かりやすくするためのものです。

出力:

このコードだけで、なんとなく図ができました。簡単ですね。

しかし、横軸の各月の表示が文字化け(豆腐みたいなやつ)を起こしています。

ここは各月を表示させたいですね。各月は英数字でなく日本語なので、文字化けしています。日本語を表示させる方法のなかで、簡単なものが “japanize_matplotlib” というライブラリーを使うことです。まずはこれをインストールしてみましょう。

!pip install japanize_matplotlib   # Jupyter Labでインストールできる

これで、インストールができます。
あらためて、図を作成してみましょう。

import japanize_matplotlib   # 日本語表記が可能になる
plt.plot(a)
plt.show()

出力:

無事日本語が表示されました。

でもこれだけでは、シンプルすぎて分かりにくいですね。縦横の軸を分かりやすくしてみましょう。

import japanize_matplotlib
plt.style.use('ggplot')     # ’’のなかに図のスタイルを指定する
plt.plot(a)
plt.show()

出力:

X軸やY軸の値が分かりやすくなりましたね。plt.style.useで図のスタイルを設定しますが、ここでは ’ggplot’ を指定します。(わたしはRユーザーで、Rでは ggplot がよく使われます)
今度は線の太さとが画質を変えてみましょう

import japanize_matplotlib
plt.style.use('ggplot')
plt.figure(figsize=(6,3),dpi=200)  # dpiで画質を変更できる。
plt.plot(a['A'],linewidth=1.5)     # linewidthの値で線を太さを設定できる
plt.plot(a['B'],linewidth=1.5)     # linewidthの値で線を太さを設定できる
plt.show()

出力:

dpi は”dots per inch”の略で、1インチにどれだけドットがあるかを表しています。この数字を大きくすると、高解像になりますが、出力に時間がかかりますのでご注意を。
あとは、表題や凡例を表示させてみましょう。

import japanize_matplotlib
plt.style.use('ggplot')
plt.figure(figsize=(6,3),dpi=200) # figsize=(横幅,縦幅)を指定する
plt.plot(a['A'],label='A店')      # 凡例用に、label=’’ の中にA店と入れる
plt.plot(a['B'],label='B店')      # 凡例用に、label=’’ の中にB店と入れる
plt.title('業績経過')             # 図のタイトルを’’の中に入れる
plt.ylabel('売上',rotation=0)     # 縦軸のタイトルを’’の中に入れる
plt.legend()                     # 凡例を表示させる
plt.show()

出力:

だいぶ目標に近づいてきましたね。
次に、ノルマや目標が100であった場合に、それを表す線を赤で表示させてみましょう。それにともない、各折れ線の色を変更します。

import japanize_matplotlib
plt.style.use('ggplot')
plt.figure(figsize=(6,3),dpi=200)
plt.plot(a['A'],label='A店',linewidth=1.5,c='limegreen')  # C= で線の色を'ライムグリーン'に指定する
plt.plot(a['B'],label='B店',linewidth=1.5,c='dodgerblue') # C= で線の色を'ドジャーブルー'に指定する
plt.title('業績経過')
plt.ylabel('売上',rotation=0)
plt.hlines(100,0,6.2,'r',alpha=0.7, linestyles='--',linewidth=0.7)
plt.ylim(55,130)
plt.legend(loc='lower right')
plt.show()

出力:

ノルマである売り上げの100が分かりやすくなりました。このようにグラフに横線を入れるときは、plt.hlines を使用します。その引数を説明します。

最後にA店の業績が伸びた8月になにがあったのかが気になるところなので、注意を引きたいと思います。

import japanize_matplotlib
plt.style.use('ggplot')
plt.figure(figsize=(6,3),dpi=200)
plt.plot(a['A'],label='A店',linewidth=1.5,c='limegreen')
plt.plot(a['B'],label='B店',linewidth=1.5,c='dodgerblue')
plt.title('業績経過')
plt.ylabel('売上',rotation=0)
plt.hlines(100,0,6.2,'r',alpha=0.7, linestyles='--',linewidth=0.7)
plt.ylim(55,130)
plt.legend(loc='lower right')

# 指定した位置に注釈と矢印を入れる
plt.annotate("Point", xy = (3.95, 101), size = 15, xytext = (2, 115),
            color = "red", arrowprops = dict(width=5,alpha=0.5))
plt.savefig('graph.jpg')   # グラフを保存する(拡張子は指定できる、今回は'.jpg')
plt.show()

出力:

完成しました。矢印をいれる場合は plt.annotate を使用します。以下に引数の説明を行います。

完成形のコードは多いと感じるかもしれませんが、一度作成すると細かい調整のみで使いまわせます。

ちなみに、もっとそれっぽいグラフを書きたければ、こんな感じにもできます。

ビジネスには不向きな気がしますがね、年配の上司への報告などでは、「見にくい!」と言われそう。以下がコードです。

import japanize_matplotlib
plt.style.use('dark_background')
plt.figure(figsize=(7,3),dpi=300)
plt.plot(a['A'],label='A店',linewidth=1,c='limegreen')
plt.plot(a['B'],label='B店',linewidth=1,c='dodgerblue')
plt.title('業績経過',fontsize=10)
plt.ylabel('売上',rotation=0,fontsize=10)
plt.hlines(100,0,6.2,'r',alpha=0.7, linestyles='--',linewidth=0.7)
plt.ylim(55,130)
plt.legend(loc='lower right',fontsize=10)
plt.tick_params(labelsize=8)
plt.annotate("Point", xy = (3.95, 101), size = 15, xytext = (2, 115),
            color = "red", arrowprops = dict(width=5,alpha=0.5))
plt.show()

まずは、コピペでもいいので、コードを入力して体験してみましょう。





コメント

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