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

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

アイコン06-6657-5130

アイコンsales@hydrolab.co.jp

お問い合わせ

アイコン06-6657-5130

アイコンsales@hydrolab.co.jp

お問い合わせ

蛇使いな彼女BLOG

【第73回】 グラフ編 #1.フォント群とmatplotlibrc~グラフ文字化けでハマった時のお話~

2022.12.02

皆様こんにちは。2022年ももうあと少しですね。
今年を振り返ると仕事では新しい分野に首を突っ込んだり、今までやったことのない事を1から勉強してアウトプットする機会が多くありました。
モトハシが作業に切羽詰まっていて、ブログ記事にする余裕がなかったのが残念でしたが、それらもまとまったら追々お伝えしていこうと思います。
(夏の営業に同行したときなんて写真撮っとけばよかった~と今更後悔しています(;・∀・))


さて、今回はモトハシがmatplotlibとseabornのスタイルを併用したときにTimes New Romanフォントで特に記号が文字化けして困った経験から、フォント周りの設定について踏み込んで解説したいと思います。

matplotlib の文字化け対策ではよく「日本語に対応したフォントを設定しましょう」 や、「japanize_matplotlibをインポートすると文字化けが解消されます」、「キャッシュの消去」などの記事が検索上位に上がってきます。
でも多くの記事が断片的で私も初めは原因が何かわからないまま手当たり次第書いてある事を試していました (笑)
今日から数回に渡ってお話する内容は、上記の対策を試してみたけど文字化け直らないよ~!って人向けにmatplotlibとseabornのシステムを中心になるべく優しく説明していきます。

まず例題となるコードを以下に示しますね。

環境はconda仮想環境/matplotlib3.1.0 /seaborn0.11.2 で動かしているものをCarbonシートに貼り付けて表示しています。

↑今回はこのコードを例題にします。
Axesが複数なのは直前業務の名残で特に意味ないので気にしないでください。コードをいじるのが面倒だっただけです(笑)
ライブラリはjapanize_matplotlibをインポートしている状態からスタートします。
これはmatplotlibの日本語の文字化け対策です。これについて詳しくはwebで調べてください。

8,9行目に関して最初にrcParamsで何をしているのかだけ箇条書します。
チュートリアル(←リンクhttps://matplotlib.org/stable/tutorials/introductory/customizing.html)にも書いていますが、コーティングの際にrcParamsを設定することで、matplotlibのデフォルトスタイルを上書きすることが出来ます。

plt.rcParams['font.serif']='Times New Roman'
これはmatplotlibで使用できるセリフ(文字の周りに装飾が付いたフォント群)の中から'Times New Roman'を優先的に使用するよう変更しています。
後に説明するmatplotlibrcのfont.familyにフォント群が指定されている事が前提です。

フォント変更は他にも以下のコードが使用でき、これはフォント群を介さずより直接的に使用するフォントを指定できます。
(ex.)plt.rcParams['font.family']=任意フォント 


plt.rcParams['axes.unicode_minus'] = False

マイナスの付く値の目盛りラベルが文字化けするときの対策として設定しています。
今回は特に使わないのですが、稀にunicodeの違いでこういう問題も起こるようです。


matplotlibのフォント群はserif /sans-serif /cursive /monospace等があり、詳しくはmatplotlibrcファイルの中に記載されています。
matplotlibrcはmatplotlibの詳細設定が書かれたファイルです。
ファイルの場所はPythonベース環境のmatplotlibパッケージ内か、私のように仮想環境を使用している場合はenvs/プロジェクト名(matplotlib310)以下に在ります。
(C:/Users../Anaconda3/envs/matplotlib310/Lib/site-packages/matplotlib/mpl-data/ココ!)

matplotlibrcはVSで開く事ができます。
中身は何行にも渡ってテキストが書かれており、全て#でコメントアウトされています。
これらはデフォルト値のメモ書きですが、コメントアウトを外す事によってシステムに変更を加えることが出来ます。

例えば、ファイル198行目にfont.family : IPAexGothic とありますが、これは日本語に対応させるべくデフォルトからモトハシが変更を加えています。
確かデフォルトは210行目の#font.sans-serif と書かれたフォント群が設定されているはずです。
matplotlibのmpl-data/fontsに変更したいフォントファイルが存在する状態で、このfont.family部分を書き換えてコメントアウトを外すと、matplotlibをインポートした段階で指定したフォントが適応されます。
(以下のように日本語対応フォントを設定すると日本語の文字化けを防げます。)

また、209~213行目は先程紹介したフォント群です。
日本語の明朝体とゴシックのように、テキストの種類で分けられています。
「:」の後にはそれぞれフォントが「,(コンマ)」で区切られズラッと並んでいます。
ちなみにこのフォント群リストに後からダウンロードしたフォント名を追加して、自分好みにカスタマイズすることも出来ます。
その場合はfont.familyに書き換えたフォント群を指定し、編集した行2箇所のコメントアウトを外して保存してください。

これらの設定を完了した状態から、C:/Users/ユーザー/.matplotlib のキャッシュを消去し、Pythonスクリプトでmatplotlibのフォント設定を確認します。

デフォルトで'IPAexGothic'が設定されました。↑
この状態から先程のPythonコードを実行すると、plt.rcParams['font.serif']='Times New Roman'でフォントをあとから変更しようとしても、matplotlibrcのfont.familyでserifフォント群ではなく、直接'IPAexGothic'に設定しているのでフォントは変更されず、Times New Romanで文字化けするはずの「あ」及び記号「▽」の文字化けもしません。

グラフタイトル拡大

日本語を入力した場合

このような環境でフォントを変更したい場合はplt.rcParams['font.family'] を使って直接フォントを指定してやってください。
よく使うフォントが複数あって、状況によって使い分けをしたい場合はmatplotlibrcのfont.familyをフォント群に設定し、そのフォント群のリストをカスタマイズすると便利かもしれませんね。

pagetop