plotly でグラフの線の太さや色を後から変更する

こんなグラフがあったとして、後から線の色や太さを変えたいとしたら？

~~~python
import plotly.graph_objects as go
from plotly.subplots import make_subplots

fig = make_subplots(rows=2, cols=3, subplot_titles=['aa','bb','cc','dd','ee','ff'])
fig.update_layout(height=600,width=800)

L1 = go.Scatter(x=[1,2,3], y=[1,3,1], name='foo')
L2 = go.Scatter(x=[1,2,3], y=[2,2,2], name='bar')
L3 = go.Scatter(x=[1,2,3], y=[3,1,3], name='fizz')
L4 = go.Scatter(x=[1,2,3], y=[3,1,3], name='bazz')
L5_1 = go.Scatter(x=[1,2,3], y=[2,2,2], name='hoge')
L5_2 = go.Scatter(x=[2,2,2], y=[1,2,3], name='hanage')
L6 = go.Scatter(x=[1,2,3], y=[1,3,1], name='fuga')
fig.add_traces([L1,L2,L3,L4,L5_1,L5_2,L6], rows=[1,1,1,2,2,2,2], cols=[1,2,3,1,2,2,3])

fig.show()
~~~
![newplot(9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143934/b9d4b547-d443-26dd-f582-892c409f5add.png)
## update_traces()
plotly ではグラフの装飾等に変更を加える手段として update_annotations(), update_xaxes(), update_yaxes() ... といった、update関連のメソッドが用意されている。追加したトレース(グラフ)を変更するには update_traces() を使用するが、お察しの通りメソッド名が複数形となっているものは変更対象を複数とるため対象を適切に指定する必要がある。
### 一括変更
デフォルトでは全てのグラフが変更される。
~~~python
#グラフを一括更新する
fig.update_traces(line=dict(color='orange',width=3))
~~~
![newplot(10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143934/0bca44ec-bc21-c341-131a-4fd15953ae05.png)

全てのグラフが変更された。変更対象を指定するには以下の方法がある。
### col=, row= で変更するサブプロットを指定する
サブプロットの列と行(段)でグラフを指定する方法。列のみ、行のみを指定すると指定した列・行に一致するグラフが全て変更される。
~~~python
# 2列目を変更する
fig.update_traces(col=2, line=dict(color='orange',width=3))
~~~
![newplot(11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143934/2a428659-95f4-4be3-6c8f-22a110465fec.png)
2列目のグラフが変更された。1,2段目とも変更された。2段目のグラフは hoge, hanage の2つのトレースが存在するがどちらも変更されている点に注意。col, row の両方を指定すれば一つのサブプロットが変更される。
~~~python
# 1列目、1行目を変更する
fig.update_traces(col=1, row=1, line=dict(color='orange',width=3))
~~~
![newplot(12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143934/d66aa9ed-a213-f62d-214d-a8d394b63443.png)
左上のサブプロットのみが変更された。なお、一度に複数列・複数行は指定できない。例えば col=[1,2] といった指定は受け付けないので注意。
### selector で変更対象を指定する 
selector を使用すると、名前やグラフの種類などグラフが持つプロパティで対象を指定することが出来る。
#### トレースの追加順番で指定する
トレースを追加した順を 0 始まりでカウントして、その番号で指定する。5番目のトレースを変更したければ 4 を指定する。
~~~python
# 5番目のグラフを更新する
fig.update_traces(selector=4,line=dict(color='red',width=3))
~~~
![newplot(13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143934/5d0450ec-7c1b-94f7-3228-26d086d202c9.png)
col, row のサブプロット単位の指定では複数トレースを取ったグラフで両方のトレースが変更されたが、この方法では特定の単一のトレースのみ変更されている。
#### トレースの名前で指定する
トレースのプロパティで指定することも可能。名前が bazz であるトレースを変更したければ、dict(name='bazz') とする。もし同じ名前を持つトレースが全て対象となるので注意。
~~~python
#nameが'bazz'に一致するグラフを更新する
fig.update_traces(selector=dict(name='bazz'),line=dict(color='red',width=3))
~~~
![newplot(14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143934/68068d33-839b-63a5-5717-dcfa87fd7bb0.png)

#### トレースの種別で指定する
トレース種別で指定する場合は type を用いて、dict(type='Scatter') とする。ただし、selectorに文字列を渡すとデフォルトでdict(type='文字列')として扱われるので、selector = 'Scatter' と書くことが出来る。
~~~python
#typeが'Scatter'に一致するグラフを更新する
fig.update_traces(selector=dict(type='Scatter'),line=dict(color='red',width=3))

#type の場合はこう書いても良い。結果は同じになる
fig.update_traces(selector='scatter',line=dict(color='red',width=3))
~~~
#### 線の太さや色でも指定できる
あまり使わないかもしれないが、特定の線のトレースを変更するといった使い方も可能。
~~~python
#「赤色、線の太さ3」のトレースを、「青色、線の太さ5」に変更する。
fig.update_traces(selector=dict(line=dict(color='red',width=3)),line=dict(color='blue',width=5))
~~~
## まとめ
対象を複数とるupdate関連メソッドは col, row, selecor のパラメータで対象を指定することが出来る。
こちらも参照→[Creating and Updating Figures in Python](https://plotly.com/python/creating-and-updating-figures/)
scatterのプロパティについて→[Python Figure Reference: scatter Traces](https://plotly.com/python/reference/scatter/)