ArcGIS API for Python では様々な オープンソース ライブラリを活用していますが、グラフを描画する際は主に matplotlib が使用されています。
matplotlib をデフォルトのまま使用すると日本語のテキストは文字化けしてしまいますが、フォント設定を変更することで表示させることが可能です。
ここでは、次の環境を用いた場合の設定方法を説明します。
日本語フォントの多くは ttc ファイルで提供されていますが、以前の matplotlib は ttc ファイルに対応していませんでした。matplotlib 3.1.0 から ttc ファイルに対応するようになったため、フォントを追加でインストールすることなく日本語を表示させることができるようになっています。それ以前のバージョンをご利用されている場合は以下をご検討ください。
設定方法は主に以下の 2 通りがあります。
前者の方法では一時的な設定変更、後者では恒久的な設定変更が可能です。 どちらが適しているかはご自身の状況に合わせて選択してください。
次のコードをスクリプトの最初に実行することでフォント設定を変更することが可能です。
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams["font.family"] = "sans-serif"
rcParams["font.sans-serif"] = ["Meiryo"]
rcParams
は matplotlib のデフォルト設定が入っているオブジェクトです。
上記では Windows で利用可能な Meriyo に変更していますが、ご自身の OS 等に応じて適宜フォントファミリー、フォントを変更してください。
設定したらサンプル コードを実行してみましょう。
上記の設定方法では毎回スクリプトの最初にコードを実行する必要がありますが、以下の方法でデフォルトのフォントを恒久的に変更することが可能です。
次のコードを実行して matplotlib の設定ファイルである matplotlibrc のパスを確認します。
import matplotlib as mpl
mpl.matplotlib_fname()
matplotlibrc が格納されているパスへ移動しファイルをコピーしたら、以下のディレクトリにペーストします。
C:\Users\<ユーザー名>\.matplotlib
conda を使用して複数の環境を作成・利用している場合、それぞれの環境が matplotlibrc を保持しています。
上記のパスに配置された matplotlibrc は各環境の matplotlibrc よりも優先されるため、当該ファイルを修正するだけで全ての環境で日本語のフォントを設定することができます。
ペーストした matplotlibrc のフォント設定部分を書き換えます。
matplotlibrc は非常に長いファイルですが、160 行目あたりからフォント設定のセクションが始まります。
198 行目にフォント ファミリー、210 行目に sans-serif のフォント設定の箇所があります。
フォント ファミリーはデフォルトが sans-serif なので、ここではデフォルト設定のままにしておきます。
210 行目のフォント設定の行で、#
を削除し、:
の後に日本語のフォントを追加しましょう。
ここでは Meiryo
に設定します。設定後の画面は以下のようになります。
以上で設定は終了ですが、うまく反映されない場合があるので、念のため以下のコードを実行してキャッシュを再構築します。
import matplotlib.font_manager
matplotlib.font_manager._rebuild()
設定が完了したらしたら以下のサンプルコードを実行してみましょう。
フォント設定が完了したら以下のサンプル コードを実行してみましょう。
import matplotlib.pyplot as plt
import numpy as np
def test_function(x):
return 3*x**3 + 2*x**2 + 4*x - 10
x = np.linspace(-3, 3, 200)
plt.plot(x, test_function(x), color = "cornflowerblue", label = "日本語のラベル")
plt.legend(loc = "upper left")
plt.ylim(-120, 120)
plt.title("日本語のタイトル")
plt.xlabel("日本語のX軸")
plt.ylabel("日本語のY軸")
plt.grid(True)
plt.show()
次のようなグラフが描ければ成功です。