奇人凡人の雑記帳

趣味とか投資とか、twitterに書きにくいことをこちらに書きます。毎週金曜更新目標(現在多忙のため月1の投資成績がメインです)

【pythonanywhere】matplotlibグラフのラベルや凡例を日本語で表示するには

h05torです。

 

h05torさん最近プログラミング関係の記事投稿していませんでしたよね。何していたのかな?

いや、去年からゲームやり過ぎてたのですよ。

ソシャゲじゃなくて任天堂ゲーだったらOKという謎基準でポケモンのBDSPから始まってレジェンドアルセウスで図鑑のミッション埋めの沼にはまって、昨年終盤からはファイアーエムブレムシリーズの過去作制覇やりだしたりといったところです。

 

いくら大学の研究室時代のソシャゲー&音ゲー狂いの過去を塗りつぶしたいからいといって任天堂ゲーなら無尽蔵に時間費やして言い訳じゃないからな!

 

以下、本題です。

 

pythonでグラフ等を作成できるライブラリとしてmatplotlibがありますが、特になにも指定しないとグラフの軸や判例の文字列に日本語を使用すると文字化けが起こり、□□□と表示されます。(↓は文字化けを起こしている例です。)

WindowsのPCでローカル環境で使用する分には以下のコードのように軸ラベルと凡例(legend)でフォントを「MS Gothic」とすることで軸ラベルや凡例を日本語で表示することができます。

        # figureオブジェクトを作成
        fig = plt.figure(figsize=(20,22))
        plt.rcParams["font.size"] = 18
        ax1 = fig.add_subplot(321)#引数の数字は、行・列・場所
        ax1.set_xlabel("横軸", fontname="MS Gothic",fontsize=9)
        ax1.set_ylabel("縦軸", fontname="MS Gothic",fontsize=11)
        ax1.plot(x,y)
        ax1.legend(["凡例"], prop={"family":"MS Gothic"})

 

しかし、この方法はpythonanywhereでは使えません。

なぜならMS Gothicはマイクロソフト社のOSであるwindowsに標準搭載されているもので、pythonanywhereのサーバーに使用されているOSはLinuxなのでMS Gothicが入っていないからです。

そのためMS Gothicを指定していると、以下のようなエラーログが残ります。(ちなみにデフォルトで入っているフォントに切り替えられるので処理自体は止まらずに済みます)

私が確認したところだと、pythonanywhereに初期状態で日本語に対応しているフォントが入っていないようでしたので、日本語に対応しているフォントをpythonanywhereのアカウントにインストールする必要があります

 

ここで、「IPAexGothic」というフォントをpythonanywhere上のmatplotlibに適用できるようにします。このフォントは情報処理推進機構IPA)が公開しているオープンソースのフォントなので自由に使用できます。

↓こちらからzipファイルをダウンロード後、解凍するとipaexg.ttfというファイルが入っており、これがフォントファイルとなっております。

IPAex フォント Ver.004.01 | 一般社団法人 文字情報技術促進協議会 (moji.or.jp)

 

このipaexg.ttfをpythonanywhere上に置く方法です。

①pythonanywhereのホームディレクトリ(管理画面ページの「Files」を押すと表示されるディレクトリで、アカウント名のディレクトリです。)に「fonts」ディレクトリを作成します。

fontsdir

②「Consoles」からBashコンソールを開き、以下のコマンドを実行します。

fc-cache -f -v

    すると、フォントキャッシュが更新され、fontsディレクトリに入れたフォントが適用できるようになります。

  pythonanywhereで使用できるようになったフォントは以下のコマンドで確認することができます。

fc-list

一応確認してみると・・・

よし、入っていますね。

 

一応ここまでの参考ページです。(英語)→Fonts | PythonAnywhere help

 

さて、これで以下のようにフォントをIPAexGothicに指定して再度グラフを出力してみます。

        # figureオブジェクトを作成
        fig = plt.figure(figsize=(20,22))
        plt.rcParams["font.size"] = 18
        ax1 = fig.add_subplot(321)#引数の数字は、行・列・場所
        ax1.set_xlabel("横軸", fontname="IPAexGothic",fontsize=9)
        ax1.set_ylabel("縦軸", fontname="IPAexGothic",fontsize=11)
        ax1.plot(x,y)
        ax1.legend(["凡例A","凡例B","凡例C"], prop={"family":"IPAexGothic"})

すると・・・・

graph-font-ipaexgothic

はい、軸ラベルや凡例を日本語で正常に表示することができました。

 

というわけでpythonanywhereの方も1年以上文字化けしたまま放置してきましたが、ようやく文字化けを解消することができました。

 

 

 

 

 

 

Djangoは今年中に別アカウントでFlask版のコピーサイトやるのですよねh05torさん?