3
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-01-25

plotlyで作成したグラフをPDF出力とhtml出力させようとしたらハマった話の第二弾です。
第一弾のfig.write_imageを実行するとValueErrorが発生してハマった話はこちら

環境

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

実現したいこと

Plotlyで動的なグラフを作成し、作成したグラフを出力する。

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が発生しました。

エラー内容

AttributeError Traceback (most recent call last)
in ()
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'

解決方法

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

!pip install plotly==5.1.0

!pip install -U kaleido

以下、解決に至るまでの詳細です。

やってみたこと

こちらのサイトをもとに以下コマンドをグラフ作成前に追記

pip install chart-studio
import chart_studio.plotly as py

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

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

分かったこと

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

参考サイト

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1