Plots.jlを魔改造せず手軽にGRバックエンドで日本語フォントを利用する模索
前回のPlots.jlのGRバックエンドで日本語と絵文字を同時に使うを書いた後,
GRフレームワークのCライブラリのドキュメントを確認すると,
gr_loadfont関数の解説に,
フォント名に指定可能な内容として
- フォントファイルの
絶対パス - OSにインストール済みの
フォントファイル名 - 環境変数
GKS_FONT_DIRSの中のフォントファイル名
ということで,フォントファイルの絶対パスを指定すればインストールしていなくても
いいことが分かった。
また,Plots.gr_set_font関数
の中身を確認すると,Plots.gr_font_familyにGR.loadfontの結果を保存してさえすれば,必ずしも
Plots.jlの関数を魔改造する必要がないことが分かった。
ということで次のような関数を作成した。
# https://github.com/ujimushi/PlotsGRBackendFontJaEmoji.jl の元ネタです using Plots function plots_gr_register_user_font(fontname, fontpath) font_id = lowercase(fontname) if !haskey(Plots.gr_font_family, font_id) gff_id = Plots.GR.loadfont(fontpath) if gff_id > 0 Plots.gr_font_family[font_id] = gff_id else @info "「$fontname」の登録に失敗しました" end else @info "「$fontname」は既に登録されています" end nothing end
ここで,次のようにCicaフォントのボールド体の絶対パスを指定・登録して プロットしてみる。
using Plots import GR plots_gr_register_user_font( "cica bold", joinpath(ENV["HOME"], "Downloads", "Cica_v5.0.3", "Cica-Bold.ttf")) gr(fontfamily="cica bold") plot(sin; title="太字 🐻") savefig("cica_bold.png")

ちゃんと日本語と絵文字が表示された。
インストールしなくても表示できるということは,パッケージにもしやすい。
ということで,Pythonにおけるmatplotlib-fonja のようなパッケージのつもりで PlotsGRBackendFontJaEmoji.jlのような感じで公開してみた。
PlotsGRBackendFontJaEmoji.jlの紹介
このパッケージの特徴はusing Plots; using PlotsGRBackendFontJaEmojiだけで日本語と絵文字が利用可能,というところだ。
これまでのPlots.jlの魔改造が必要な方法とは全くお手軽さが違います。
インストール方法
パッケージモードからは次のような感じでインストール可能です。
(@v1.11) pkg> add https://github.com/ujimushi/PlotsGrBackendFontJaEmoji.jl
もしくは次のような感じです。
using Pkg Pkg.add(url="https://github.com/ujimushi/PlotsGrBackendFontJaEmoji.jl")
利用例
次のような感じでCicaフォントを用いた日本語と絵文字の同時表示が可能です。
using Plots using PlotsGRBackendFontJaEmoji gr() plot(sin; title="日本語🐱")

フォント設定をリセットする時はdefault()と引数無しでdefault関数を呼びます。
cicaフォントの登録名はFONT_JA_EMOJIに設定してあるので,
using Plots using PlotsGRBackendFontJaEmoji gr() default() plot(sin; title="日本語🐱", titlefontfamily=FONT_JA_EMOJI)
でタイトルのみ絵文字と日本語を使うフォントに設定する,等が可能です。
Windowsの場合だとplots_gr_register_user_font("msgothic", "msgothic.ttc")とか
Linuxの場合だとplots_gr_register_user_font("noto sans cjk", "NotoSansCJK-Regular.ttc")
とかで登録し,フォントファミリーを第一引数に設定することで,TTCフォントも利用可能です。
ただし,第0面固定で1面以降のグリフは設定できません。
まとめ
とりあえず,個人的にはPlots.jlのGRバックエンドで日本語を取扱う方法についての探索も これで一区切りです。
日本のJulia言語ユーザーのおえらいさんの言う事によると, 「できるだけ新しくてかつ信頼できる人の解説を見るのがよい」らしいので,信頼できない私の言うことは信じず, 皆さんにはぜひともPyPlotで日本語を利用して欲しいと思います。