【20.05.13改訂】不明確だったことが色々分かったので全面改訂しました。また、Julia v1.4.1と最新のパッケージの現状を前提に書き換えています。Windows環境に依存した記載
#Plots+バックエンドPyPlotで描くグラフに日本語を表示させる方法
##背景
参考1のPlotsの公式の解説を見てfontを指定すれば、難なく日本語を表示できる場合もありますが、駄目な場合にも遭遇するかと思います。この記事に、メモとして解決の手順を記します(少しだけ意味も書いておきます)。
【参考1】公式解説http://docs.juliaplots.org/latest/attributes/
##解決の手順
①使用したいフォントファイル(多分TTFじゃないと駄目)を用意する。
※ここではIPAexフォントをダウンロードして、OSに追加することにします。
②matlibplotのfontlistを更新する。
具体的には、Julia上で以下を実行すれば良いです。
using PyCall
fm = pyimport("matplotlib.font_manager")
fm._rebuild()
または、ほぼ等価なこととして、Python上で以下を実行しても良いです(Julia用のコードはPyCallを介してPython用のこちらのコードを実行しているはず)。
import matplotlib.font_manager as fm
fm._rebuild()
こちらのPythonでのやり方は、参考2の事前準備03の通りです(他にも参考になることが色々書かれておりためになりました)。
【参考2】cuccoさんの記事:matplotlibの日本語対応
matlibplot
https://compute-cucco.hatenablog.com/entry/2019/03/10/002315
##②のコード実行の意味
何が行われるかと言うと、ディレクトリC:\Users\某文字列\.matplotlib
に行きfontlist-v某数字.json
を見れば分かります。上記コードの実行時に、このフォントリストが更新されることが分かります。これは、PyPlotで使用できるフォントをリストアップしたもので、PyPlotのインストール時に初期生成されます(テキストファイルになっており、エディタで開けばフォント名等を見ることができる)。その時点でOSに追加されているフォントを自動的に補足してリストが生成されているようです。なので、PyPlotのインストール後にOSに追加したフォントについては、上記のコードのように更新の命令を実行しないと、そのフォントをPyPlotで使用することができないようです。
##動作テスト
前記事の【例1】と【例2】に日本語を付けて表示させた場合を以下に示します。
【例1'】1つのグラフエリアに曲線を2つ描画
using Plots
import Plots.PlotMeasures.px #pxを単位のように使用するための準備(Plotsのバージョンアップに伴ってpxはimportやusingしておく必要が出た)
pyplot()
x=collect(0:0.01:2*pi)
y1=sin.(x)
y2=cos.(x)
plot(x, y1, xlab="横軸 x [mm]",
ylab="縦軸 y [mm]",
lab="正弦",
leg=:bottomleft,
margin=15px,
guidefont=font("IPAexGothic",11), #軸名のフォントとサイズの指定(サイズ指定もしないとサイズ14に固定されてしまう)
legendfont=font("IPAexGothic",8), #凡例のフォントとサイズの指定
tickfont=font("IPAexGothic",8)) #目盛のフォントとサイズの指定(他とフォント揃えるためにだけ指定)
plot!(x, y2, lab="余弦")
【例2'】上下2段組のグラフエリアを作成し、それぞれに曲線を1つ描画
using Plots
import Plots.PlotMeasures.px
pyplot()
x=collect(0:0.01:2*pi)
y1=sin.(x)
y2=cos.(x)
p1=plot(x, y1, lab="正弦")
p2=plot(x, y2, lab="余弦")
plot(p1,p2, xlab="横軸 x [mm]",
ylab="縦軸 y [mm]",
leg=:bottomleft,
margin=15px,
layout=grid(2,1),
guidefont=font("IPAexGothic",11), #軸名のフォントとサイズの指定(サイズ指定もしないとサイズ14に固定されてしまう)
legendfont=font("IPAexGothic",8), #凡例のフォントとサイズの指定
tickfont=font("IPAexGothic",8)) #目盛のフォントとサイズの指定(他とフォント揃えるためにだけ指定))