plotlyで作成したグラフをPDF出力とhtml出力させようとしたらハマった話の第二弾です。
第一弾のfig.write_imageを実行するとValueErrorが発生してハマった話はこちら
環境
使用した環境
・Google Colaboratory
使用言語
・Python
実現したいこと
Plotlyで動的なグラフを作成し、作成したグラフを出力する。
!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以降に指定して使用する必要がある
参考サイト