plotlyを実行したらAttributeErrorが発生してハマった話

plotlyで作成したグラフをPDF出力とhtml出力させようとしたらハマった話の第二弾です。
第一弾のfig.write_imageを実行するとValueErrorが発生してハマった話は[こちら](https://qiita.com/yuuun/items/1e35318c067e7e6b3465)

## 環境
使用した環境
・Google Colaboratory
使用言語
・Python

## 実現したいこと
Plotlyで動的なグラフを作成し、作成したグラフを出力する。

```python:AttributeError発生サンプルコード
!pip install japanize-matplotlib

%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import cm
import japanize_matplotlib 
import plotly
import plotly.graph_objs as go

# plotlyを使用するための準備
import plotly.io as pio
from plotly.subplots import make_subplots
pio.renderers.default = "colab"

plt.rcParams['font.family']
plt.rcParams['font.family'] = 'IPAexGothic'


!pip install plotly
# kaleidoを使用するための記述
!pip install -U kaleido
!pip install --upgrade plotly

!pip install fpdf

# 「IPA」フォントをインストール
!apt-get -y install fonts-ipafont-gothic
# matplotlibのキャッシュをクリア
!rm /root/.cache/matplotlib/fontlist-v300.json

# plotlyの簡単なグラフを作成
trace = go.Scatter(
    x = [1,2,3,4,5],
    y = [10,20,30,20,10],
    mode = 'markers + lines',
    text=["A","B","C","D","E"],
    marker= dict(size= 14,
                line= dict(width=1),
                color= "red",
                opacity= 0.3
                ),
)

data = [trace]
go.Figure(data).show()

trace1 = go.Scatter(
    x = [1,2,3,4,5],
    y = [10,20,30,20,10],
    mode = 'markers + lines',
)

trace2 = go.Scatter(
    x = [1,2,3,4,5],
    y = [20,20,20,20,20],
    mode = 'markers + lines',
)

data = [trace1, trace2]

layout = go.Layout(
    title  ="2つのトレース",
)

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

fig.write_image("該当ファイルを置きたいパス/test.pdf")
```

上記のコードを実行するとAttributeErrorが発生しました。

<details><summary>エラー内容</summary><div>

>AttributeError                               Traceback (most recent call last)
<ipython-input-6-cf07760790be> in <module>()
      7                 line= dict(width=1),
      8                 color= "red",
----> 9                 opacity= 0.3
     10                 ),
     11 )

>1 frames
/usr/local/lib/python3.7/dist-packages/plotly/graph_objs/__init__.py in __init__(self, arg, cliponaxis, connectgaps, customdata, customdatasrc, dx, dy, error_x, error_y, fill, fillcolor, groupnorm, hoverinfo, hoverinfosrc, hoverlabel, hoveron, hovertemplate, hovertemplatesrc, hovertext, hovertextsrc, ids, idssrc, legendgroup, line, marker, meta, metasrc, mode, name, opacity, orientation, r, rsrc, selected, selectedpoints, showlegend, stackgaps, stackgroup, stream, t, text, textfont, textposition, textpositionsrc, textsrc, texttemplate, texttemplatesrc, tsrc, uid, uirevision, unselected, visible, x, x0, xaxis, xcalendar, xsrc, y, y0, yaxis, ycalendar, ysrc, **kwargs)

>/usr/local/lib/python3.7/dist-packages/_plotly_utils/importers.py in __getattr__(import_name)
     39         raise AttributeError(
     40             "module {__name__!r} has no attribute {name!r}".format(
---> 41                 name=import_name, __name__=parent_name
     42             )
     43         )

>AttributeError: module 'plotly.validators.scatter' has no attribute 'ErrorXValidator'
</div></details>

## 解決方法
以下コマンドを記述してplotlyをKaleidoを標準機能として提供しているバージョンを指定してインストールすることで解消できました。

```
!pip install plotly==5.1.0

!pip install -U kaleido
```
以下、解決に至るまでの詳細です。


## やってみたこと
・[こちら](https://github.com/plotly/orca/issues/290)のサイトをもとに以下コマンドをグラフ作成前に追記

```
pip install chart-studio
import chart_studio.plotly as py
```

→「再起動してすべてのセルを実行」を実行すると通るが、「ランタイムを出荷設定時にリセット」してから「すべてのセルを実行」すると同様のエラーが発生してしまう。

・重複したインストール、アップグレードを実行するとうまく動かない場合がある旨の記載を[GutHub](https://github.com/plotly/plotly.py/issues/1789)にて発見
→重複したインストール、アップグレードの記述を削除してから動作確認するもうまく動かない。。。（Kaleidoを使用するよう指定している記述の箇所でエラー発生）
→そこでplotlyのソースがあるGitHub内にヒントが無いか探したところ、
Kaleidoを標準機能として提供し、自動で使用されるのはplotlyの新しいバージョンからという[記載](https://github.com/plotly/plotly.py/issues/3298)を発見したので追記したところエラー解消できました！


## 分かったこと
以下今回分かったことを箇条書きにします。
・!pip install --upgrade plotly を実行してもKaleidoを標準機能として提供してくれるわけではない
・fig.write実行時に自動的にKaleidoが使用されるバージョンにならず、その場合は再起動しないといけなくなる（「出荷設定時にリセット」して「すべてのセルの実行」だけだとうまく動かない）
・つまり、Kaleidoを使用したい場合はバージョンを5.1.0以降に指定して使用する必要がある

## 参考サイト

https://stackoverflow.com/questions/60171837/using-plotly-latest-version-and-getting-error-module-plotly-validators-layout

https://github.com/plotly/plotly.py/issues/1789

https://github.com/plotly/plotly.py/issues/3298