分析業務に利用するため,Julia言語のPlotsでPolarプロットをする方法を調べていた。 そこでググった時に見つけたのがGRでpolar plotのレイアウトを変更するというJuliaのTipsの一つ。
この内容を見ると,
@eval Plots begin function gr_polaraxes(rmin::Real, rmax::Real, sp::Subplot) ... end end
という感じで,PlotsのGRバックエンド内にあるgr_polaraxies
という関数を書き換えている。
えっ,こんな ズルい 便利なことができるの? これならパッチ当て放題やん!!
ということで,これを利用して,PlotsのGRバックエンドでttcフォントを使う方法を紹介したい。
長らく日本語フォントが使えなかったGRバックエンドだったが,
2023年の初め頃からttfフォントに関しては,OSにインストール済みのユーザーの指定フォントが
利用可能となっている。
指定方法は,フォントファイルの拡張子より前(IPAゴシックipag.ttf
の場合,ipag
)を指定する。
ただ,WindowsではOS標準の日本語フォントはほとんどがttcフォントのため,日本語を表示するためにわざわざttfフォントを別途インストールする必要がある。
そこで,先ほどのサイトの例を応用して日本語フォントを使ってみた例を紹介する。 ソースは次の通り。
using Plots gr() @eval Plots begin function gr_set_font( f::Font, s; halign = f.halign, valign = f.valign, color = f.color, rotation = f.rotation,) family = lowercase(f.family) GR.setcharheight(gr_point_mult(s) * f.pointsize) GR.setcharup(sincosd(-rotation)...) if !haskey(gr_font_family, family) # この辺を変更 gr_font_family[family] = begin ttf = GR.loadfont(string(f.family, ".ttf")) ttf >= 0 ? ttf : GR.loadfont(string(f.family, ".ttc")) end end haskey(gr_font_family, family) && GR.settextfontprec( gr_font_family[family], gr_font_family[family] ≥ 200 ? 3 : GR.TEXT_PRECISION_STRING, ) gr_set_textcolor(plot_color(color)) GR.settextalign(gr_haligns[halign], gr_valigns[valign]) nothing end end plt_min = plot(sin, titlefontfamily="msmincho", title="MS明調") plt_goth = plot(cos, titlefontfamily="msgothic", title="MSゴシック") plt = plot(plt_min, plt_goth, layout=grid(2, 1)) savefig(plt, "mincho_and_gothic.png")
グラフは次の通り。ゴシックと明調,指定通りのフォントでタイトルが表示されている。
変更の中身は単純で,.ttf
の拡張子を足して登録しようとしているところに,失敗したら.ttc
も試してみているだけである。
ここで,使用上の制限は次の通りである。
- ttcフォントの最初の面のみ表示可能(多分regularとかnormalとか固定で太字とかは無理) →GRライブラリにはttcの何面を利用するかを指定をする方法がないため
- 一回ttfフォントで登録してみて失敗したらttcフォントを登録する方法をとっている →必ずWarningが出る
なお,ttc
のところをotf
に変えても大丈夫なので,macとかの人にも役に立つかもしれない。
ただ,モジュールの中身を改変するという禁断の方法であるので,用法を守って悪用厳禁でお願いしたい。
追記
なお,OSにインストールされている任意のフォントを利用可能にするにはWindowsユーザー向けにはPlots.jlのGRバックエンド用フォントパッチ(Windows用),Linuxユーザー向けにはPlots.jlのGRバックエンド用フォントパッチ(Linux用)の情報がこの日記の記事にあるので参考にしてみて下さい。