ujimushi(@旧sradjp(15364))の日記

旧スラドの日記の引越先です

Julia言語のPlotsのGRバックエンドでttcフォントを使う方法

分析業務に利用するため,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用)の情報がこの日記の記事にあるので参考にしてみて下さい。