【1日目】Plotlyで始める「魅せるデータ分析」～超基本編～

# 初めに
　みなさんこんにちは！今回は1日目ということで、実際にPlotlyを動かしていきましょう。
めちゃくちゃ丁寧に書きますので、ペースはゆっくりですが、みていってくださいね。
　実際に自分で手を動かしていただいたほうが、理解しやすいかもしれません。
## リンク
[【0日目】Plotlyで始める「魅せるデータ分析」～概要編～](https://qiita.com/yamazaki_yuto/items/fafb732e4b26648b0eb4)
【1日目】【1日目】Plotlyで始める「魅せるデータ分析」～超基本編～
[【2日目】Plotlyで始める「魅せるデータ分析」～多種多様なグラフを描画する～](https://qiita.com/yamazaki_yuto/items/1de1b68ceb425cefc261)

### Plotlyのインストール
 まだPlotlyをインストールされていない方はpipで簡単にインストールすることができます。

# 本日のまとめ
 Plotlyの構造を理解し、拡張性の高いコードを書きましょう！
```exsample_day1.py

import plotly.graph_objects as go
data = go.Scatter(
    # ここにデータを書く
)

layout = go.Layout(
    # ここにレイアウトを書く
)
fig = go.Figure(
    data=data,
    layout=layout
)

fig.show()

```

# とりあえず、動かしてみましょう
　超シンプルな散布図をplotlyで作ってみましょう。

```sassion01.py
import plotly.graph_objects as go
fig = go.Figure(
    go.Scatter(x=[1, 2, 3], y=[1, 3, 2]),
)
fig.show()

```
このコードを実行するとデフォルトのウェブブラウザが立ち上がり、
下記のようなグラフが表示されるはずです。
    　![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3067701/009fae08-8d4d-a8cf-e3cb-9e298bf82f91.png)

# Plotlyの可読性
とりあえず、グラフを描画することはできましたね。しかし、このコードは記述を省いております。
　go.Figure()から作成したインスタンスをfigに代入していますが、このgo.Figure()クラスには様々な引数を設定することができます。例えば、以下のようなコードでは、dataという引数にgo.Scatter()から生成されたインスタンスを渡しています。上記の図と同じグラフが表示されるはずです。
```session02.py

import plotly.graph_objects as go
fig = go.Figure(
    data=go.Scatter(x=[1, 2, 3], y=[1, 3, 2])
)
fig.show()

```

go.Figure()クラスの第一引数はdefaultでdataが渡されますが、こちらのほうが圧倒的に可読性が上がります。

　また、今回はdataの中身が少ないからこれでもよいかもしれませんが、dataの中身が膨大になってくると先ほどのコードでも可読性が悪くなります。
　ですので、plotlyでは以下のように先にgo.Scatter()オブジェクトを作成しておくのが一般的です。
```session03.py
import plotly.graph_objects as go
data = go.Scatter(
    x=[1, 2, 3],
    y=[1, 3, 2]
)


fig = go.Figure(
    data=data,
)
fig.show()
```

コードが少し長くなってしまいましたが、わかりやすくなりましたね。
ここまでのsession01.py, session02.py, session03.pyはすべて同じ挙動をします。


# layoutの追加
　go.Figure()には引数としてdataやlayoutオブジェクトを渡すことができます。今回はgo.Layout()から生成されるlayoutインスタンスについて説明します。こちらもdataと同じように設定することができます。
```session04.py
import plotly.graph_objects as go
data = go.Scatter(
    x=[1, 2, 3],
    y=[1, 3, 2]
)

layout = go.Layout(
    title="test"
)
fig = go.Figure(
    data=data,
    layout=layout
)

fig.show()

```
![1-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3067701/9a613bb1-c39a-9129-a504-36c6a13fa92c.png)
「test」というタイトルが表示されるようになりました。

## ここまでのまとめ
　Plotlyはここまでのことが超基本です。go.Figure()で生成されたインスタンスの引数に他のPlotly class(go.Scatter()やgo.Layout())から生成されたインスタンスを渡します。
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3067701/b820e402-3f04-8f4a-9d0d-ebcc0797fb12.png)

## go.Layout()にプロパティをわたす
　先ほど追加したレイアウトをもう少しカスタマイズしましょう。go.Layout()には様々なプロパティを渡すことができます。
```session05.py
import plotly.graph_objects as go
data = go.Scatter(
    x=[1, 2, 3],
    y=[1, 3, 2]
)

layout = go.Layout(
    # タイトルの文字設定を細かく指定
    title=dict(
        text="test",
        font=dict(
            size=26,
            color="grey",
        )
    ),
    # 凡例を表示
    showlegend=True,
)
fig = go.Figure(
    data=data,
    layout=layout
)

fig.show()
```
こっちは値や辞書を渡すだけで設定できます。今回の例ですと、フォントの色やサイズ、また、凡例を表示するといったような設定をしております。こちらは直感的でわかりやすいと思います。
[こちらのリンク](https://plotly.com/python/reference/layout/)から使用できるものを確認できます。

# fig.update_layout()やfig.add_trace()を使ってみる
 今までの例ではgo.Figure()にdataやlayoutを引数として渡していましたが、go.Figure()のメソッドを使用して、dataやlayoutを渡すことができます。こちらはsession05.pyと同じ挙動をします。
　使いどころも結構あり、次項以降に説明することになると思います。
```session06.py
import plotly.graph_objects as go
data = go.Scatter(
    x=[1, 2, 3],
    y=[1, 3, 2]
)

layout = go.Layout(
    # タイトルの文字設定を細かく指定
    title=dict(
        text="test",
        font=dict(
            size=26,
            color="grey",
        )
    ),
    # 凡例を消す
    showlegend=True,
)
fig = go.Figure()
fig.add_trace(data)
fig.update_layout(layout)

fig.show()
```

# pxについて
　最後になります。いままではgo.Figure()クラスを使用してグラフを描画してきましたが、plotlyではexpressクラスを使用してグラフを描画することもできます。expressクラスの特徴として、カスタマイズ性は低いが簡単にグラフを作成することができるということです。
```session07.py
import plotly.express as px

fig = px.scatter(
    x=[1, 2, 3],
    y=[1, 3, 2],
    title="sample figure"
)
fig.show()
```
pxについては今後説明していきますが、当面の間は基本であるgo.Figure()クラスについて説明していこうと思います。

# 最後に
　ここまで読んでくれてありがとうございます。今後も記事更新の方頑張っていこうと思います。
どうぞよろしくお願い致します。