環境システム株式会社公式HP

〒660-0083 兵庫県尼崎市道意町7-1-3
尼崎リサーチ・インキュベーションセンター512

アイコン06-6657-5130

アイコンsales@hydrolab.co.jp

お問い合わせ

アイコン06-6657-5130

アイコンsales@hydrolab.co.jp

お問い合わせ

蛇使いな彼女BLOG

【第56回】 ライブラリ編2ー#1.バージョンアップの罠

2022.04.01

*注*
グーグルの自動翻訳がオンになっていると、画像が乱れる事があります。
その場合は翻訳をオフにしてください。

皆さんこんにちは。
プログラムを作っていると自他共にいろんな要望が出てくるので、なるべくそれらを組み込むようにコーディングしているモトハシです。
最近ライブラリのバージョンによってコードを上手く使い分けしないと、警告文がでたり、マウスポインターのぐるぐるが無限ループ(処理がストップ)する事を知りました…

今日は長年使っていたパロちゃん(matplotlib)2.1.0から3.3.1にアップグレードしたのに、結局3.2.2にダウングレードした話をご紹介します…。

パロちゃんと言えばグラフの描画をするためのライブラリですが、
このブログでもmatplotlib を用いた図化のスクリプトをいくつか紹介してきました。
2022年2月までに公開されている記事のスクリプトはPython3.6、Matplotlib 2.1.0で正常に起動するコードです。

matplotlib 2.1.0はかれこれ3年くらい使い続けていたバージョンなんですが、あるとき、「グラフスタイルのx軸・y軸のラベルの配置を変更できたらいいな」という要望を受けてベースの開発環境にあるmatplotlibを2.1.0→3.3.1にアップグレードしました。

matplotlib 3.3.1であれば、
ax.set_ylabel(loc=「‘top’ ‘center’ ‘bottom’」)、
ax.set_xlabel(loc=「‘right‘ ‘center‘ ‘left‘」)
これらのプロパティで位置を指定できます。

例えばこのスクリプトの実行結果が以下のグラフです。

yラベルの位置を変更することが出来ましたね。
私が知る限り、軸ラベル位置調整はmatplotlib 3.3.1で可能ですが、他の2.1.0、3.2.2で同じスクリプトを実行するとloc」というプロパティは存在しない為以下のようなエラー文が表示されます。

3.3.1優秀!!これからこの子をメインに使っていこうと思った矢先です。
S家先生からseabornを使ったコンター図の作成を頼まれました。

そこで、matplotlib 3.3.1にアップグレードした状態で前もって作成していたプログラムを開いて処理を実行していたところ、
UserWarning: FixedFormatter should only be used together with
FixedLocator
」というこれまで一回も見たことのない警告が出ました…。

これ、初見でなんの警告かさっぱりだったんですが、下の例文を見てください。

私の場合このプログラムを先頭から実行していくと、22行目を実行した後以下の警告文が出ます。
(何回か試しましたが、x軸、y軸どちらも警告が出るときと出ない時があります。
あと、そもそもこの警告が出るのはmatplotlib 3.3.1のエラー?らしいです)

FixedFormatterは、FixedLocatorと一緒にのみ使用する必要がありますということから(おそらく)
ticker.LinearLocatorで軸の主目盛りの個数と位置を決めた後にset_xticklabel やset_yticklabelを使って任意のラベルを割り当てることが良くないのかなあ?

調べてみるとなぜかGitHubのpandasレポートに、matplotlib 3.3.1の警告文についていくつか記載があり、警告が出ないよう修正された例文も挙がっていました。
が、回りくどくてよく分かりませんでした(笑)

例文は31行のシンプルなプログラムなので、警告が出たとしても処理自体は停止することなくグラフもこのように辛うじて出力されます。

ですが、同じキャンバスに複数の図を描かせるような複雑な描画プログラムを実行すると、処理は停止・画面フリーズ・図も大半が白紙になってしまうようです(↓こんな結果に)

警告が出ないようにコードを書き換えようにも、コンターはseabornを使って描画しているので、
置きたい位置に確実に目盛りを振って、その目盛りに自由度の高いラベルを設置するのは意外と大変なんです・・・。
それに、何より何ヶ月もかけて完成させた963行にもなる描画プログラムを書き換えるのはものすごく面倒でした。

この件でパロちゃんには少々腹が立ちましたが、matplotlib 3.2.2にダウングレードしたところ、同様の警告文と図が描けないトラブルは発生しませんでした。

ライブラリのバージョンが変わると仕様が変わるんですね(;´Д`)
このような不具合に関する情報はGitHubでも公開されています。
参考になるか分かりませんが、皆さんも気をつけてくださいね。


(※GitHubとは平たく言えばエンジニアの為の無料で使えるコミュニティで、個人で開発したプログラムの公開や、また動作に不具合があった場合の修正が行える他、エンジニア同士の情報共有が可能な場です。)

pagetop