メモ書き:グラフ

忘れそうなのでメモ書き
というか忘れてたんですけどね。

今後更新予定。現状、折れ線グラフの途中までしか書いていません。

おまじない(import)

おまじないではない。

%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd

正直、見様見真似でやり続けていたせいでmatplotlib.pyplotをpltにしかできない体になってしまったし、pandasをpdにしかできない体になってしまった。責任取ってよ!

使用データ

f:id:Amesiorine271108:20210128105524p:plain
その辺にあったなぜか見覚えのある数字の入ったデータ。なお、ぬるぬる~っとNullが入っています。427rows 3columnsです。

折れ線グラフ

とりあえず描く

とりあえず折れ線グラフを描いてみましょう。

df.plot("A")

f:id:Amesiorine271108:20210128110301p:plain
なんかできましたね。数字がデカすぎてしまっているので横軸が1e7になっています。(0,0)から始まっているこのデータはだいたい(2万,1600万)くらいまで行くようです。

軸をいじる&gridを引く

このグラフをデータの提供者(船井)に見せたところこんなことを言われました。
「あ、そのデータなんだけどね、tってやつは時間をあらわしているんだよね。縦軸が時間の折れ線グラフなんてきっも~い!キャハハハハハ!」
処す。せっかくなのでもう少し見やすいグラフにしましょう。

縦軸と横軸が間違っている?
変えて差し上げましょう!
この色だとインパクトが足りない?
変えて差し上げましょう!

ax = df.plot(x="t",y="A",color = "#dc143c")

横軸は時間らしいんだけど・・・
(名前を)変えて差し上げましょう!

ax = df.plot(x="t",y="A",color = "#dc143c")
plt.xlabel('time')

1e7が分かりにくい?
変えて差し上げましょう!

ax = df.plot(x="t",y="A",color = "#dc143c")
plt.xlabel('time')
from matplotlib.ticker import ScalarFormatter
ax.yaxis.set_major_formatter(ScalarFormatter(useMathText=True))

そもそも縦軸が10の7乗が単位ということで分かりにくかった?
変えて差し上げましょう!(*1

ax = df.plot(x="t",y="A",color = "#dc143c")
plt.xlabel('time')

class FixedOrderFormatter(ScalarFormatter):
    def __init__(self, order_of_mag=0, useOffset=True, useMathText=True):
        self._order_of_mag = order_of_mag
        ScalarFormatter.__init__(self, useOffset=useOffset, 
                                 useMathText=useMathText)
    def _set_orderOfMagnitude(self, range):
        self.orderOfMagnitude = self._order_of_mag
ax.yaxis.set_major_formatter(FixedOrderFormatter(4 ,useMathText=True))

補助線がなくて数字がつかみにくい?
変えて差し上げましょう!

ax = df.plot(x="t",y="A",color = "#dc143c")
plt.xlabel('time')

class FixedOrderFormatter(ScalarFormatter):
    def __init__(self, order_of_mag=0, useOffset=True, useMathText=True):
        self._order_of_mag = order_of_mag
        ScalarFormatter.__init__(self, useOffset=useOffset, 
                                 useMathText=useMathText)
    def _set_orderOfMagnitude(self, range):
        self.orderOfMagnitude = self._order_of_mag
ax.yaxis.set_major_formatter(FixedOrderFormatter(4 ,useMathText=True))
ax.grid()

さて、脳内にT-09-85を召喚することでグラフがいい感じになりました。なったかな?
f:id:Amesiorine271108:20210128114513p:plain

補足
plt.grid(color='#f0f8ff', linestyle='dotted', linewidth=0.5)

のように指定することで補助線の形式を変えることができる。必要なかったので今回やらなかった。

グラフの軸の幅

できたグラフを見て船井が言いました。「このグラフの原点を(0,0)にしたくない?」
ちょっと思ってた。というかこの船井はいわゆるI・船井なのでちょっと思っていたら言ってくるに決まっている。
どうやら今のデフォルトは5%の余白が作られるようになっているらしい。

import matplotlib
matplotlib.rcParams['axes.xmargin'] = 0
matplotlib.rcParams['axes.ymargin'] = 0

これを書き加えて余白を0%にすると解決できる。
f:id:Amesiorine271108:20210128120025p:plain
「それはそれとして縦軸にもう少しゆとりを持たせたいよね。せっかくだし縦軸の上限値を2000万にしてみない?」

import matplotlib
matplotlib.rcParams['axes.xmargin'] = 0
matplotlib.rcParams['axes.ymargin'] = 0
ax = df.plot(x="t",y="A",color = "#dc143c")
plt.xlabel('time')

class FixedOrderFormatter(ScalarFormatter):
    def __init__(self, order_of_mag=0, useOffset=True, useMathText=True):
        self._order_of_mag = order_of_mag
        ScalarFormatter.__init__(self, useOffset=useOffset, 
                                 useMathText=useMathText)
    def _set_orderOfMagnitude(self, range):
        self.orderOfMagnitude = self._order_of_mag
ax.yaxis.set_major_formatter(FixedOrderFormatter(4 ,useMathText=True))
ax.grid()
plt.ylim(0, 20000000)

plt.xlimやplt.ylimで軸の範囲を指定できる。これを利用して縦軸の最大値を指定した。

pandasを使わずにグラフを作るとき

どんなとき?って思うでしょう?使いたくなったんよ。
しれっと今まで書いてないmarkerとかlinestyleとか使っているのでどっかで書き残しておくと未来の私が喜ぶかもしれないね。

Tangle = [x軸のリストA]
Barbs = [y軸のリストA]
Primal = [x軸のリストB]
Surge= [y軸のリストB]

plt.plot(Tangle,Barbs, color = "red",marker="o")    
plt.plot(Primal,Surge, color = "red",marker="o",linestyle = "--")
plt.show()
f:id:Amesiorine271108:20210519063213p:plain
だいたいこんな感じのになる

用事が入ったので今はここまで。


今後書く予定のことのメモ

  • このデータ、22260分間(正確には22259分間)の数値の変動のもの。
  • なのでn時間ごと、m日ごとに補助線引いたら見やすかったりしない?
  • グラフにはタイトルをつけろ

→plt.title("グラフのタイトル")

  • しれっと今まで書いてないmarkerとかlinestyleとか使っているのでどっかで書き残しておくと未来の私が喜ぶかもしれないね。
  • 散布図とか他のグラフ