メモ書き:グラフ

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

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

おまじない(import)

おまじないではない。

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

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

使用データ


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

折れ線グラフ

とりあえず描く

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

df.plot("A")


なんかできましたね。数字がデカすぎてしまっているので横軸が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を召喚することでグラフがいい感じになりました。なったかな?

補足
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%にすると解決できる。

「それはそれとして縦軸にもう少しゆとりを持たせたいよね。せっかくだし縦軸の上限値を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()
だいたいこんな感じのになる

ヒストグラム

使ったデータ

こんな感じのデータを使って、まあなんかそれっぽくヒストグラムを作る。

plt.hist(maindf["rms"])
悪くないけどなんか見辛くない?

見辛くないかな?見辛いよね。

仕切り線って言えばいいんですかね。一個一個のバーの縁取りをしてほしい気持ちになりました。
というわけでこうする。

plt.hist(maindf["rms"],ec='black')
改善

グラフを複数描画したい!

edges = range(4000,16000,1000)
fig, ax = plt.subplots(2, 2, figsize=(12, 12))

ax[0,0].hist(maindf["rms"],ec='black',bins=edges)
ax[0,0].set_title("Main_RMS")
ax[0,0].grid(True)

ax[1,0].hist(alldf["rms"],ec='black',bins=edges)
ax[1,0].set_title("ALL_RMS")
ax[1,0].grid(True)

edges = range(-20,3,2)
ax[0,1].hist(maindf["dBFS"],ec='black',bins=edges)
ax[0,1].set_title("Main_dBFS")
ax[0,1].grid(True)

ax[1,1].hist(alldf["dBFS"],ec='black',bins=edges)
ax[1,1].set_title("ALL_dBFS")
ax[1,1].grid(True)

plt.show()

plt.subplots()で指定する……はず。
ax[n,m]はn行目m列のグラフであることを示している……はず。

散布図

plt.scatter(x=横軸,y=縦軸)

軸をいじりたい

これ散布図に限ってなくない?

plt.ylim(-0.5,3.5)

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

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

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

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