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

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

legend_font_family(Plots.jl(GR))

最初はlegend_font関係をひとまとめに日記に書く予定だったのですが,分量が多くなったので 細かく分けることにします。というかこれだけでもそこそこの分量となりました。

まずは,フォントの書体を指定するlegend_font_familyです。

別名

別名は

  • legend_font_family
  • legend_font_familys
  • legendfontfamily
  • legendfontfamilys

です。

注意点

注意点があるとすれば,「legend_fontとの違いに注意」というところです。 例えば,legend_font="times"の書き方では書体を変更できません。またこの辺りは別途説明したいと思います。

書体一覧

では標準的な書体を一気に紹介します。面倒なので,実例で。

using Plots
gr()
default(legend_position=(0.1, 0.5), legend_font_pointsize=14)
font_names = [
    "times", "helvetica", "courier", "bookman",
    "newcenturyschlbk", "avantgarde", "palatino", "serif-roman",
    "sans-serif"
]
plts = [plot(sin, legend_font_family=f, label=f) for f in font_names]
plot(plts...; layout=(3,3), size=(800, 500))
savefig("legend-font-family-01.png")

なお,参考はPlots.jlのGRバックエンドのソースリストです。

残りも一気に例示します。

using Plots

gr()
default(legend_position=(0.1, 0.5), legend_font_pointsize=14)
font_names = [
    "times roman", "times italic",
    "times bold", "times bold italic",
    "helvetica", "helvetica oblique",
    "helvetica bold", "helvetica bold oblique",
    "courier", "courier oblique", 
    "courier bold", "courier bold oblique", 
    "bookman light", "bookman light italic",
    "bookman demi", "bookman demi italic",
    "new century schoolbook roman",
    "new century schoolbook italic",
    "new century schoolbook bold",
    "new century schoolbook bold italic",
    "avantgarde book", "avantgarde book oblique",
    "avantgarde demi", "avantgarde demi oblique",
    "palatino roman", "palatino italic",
    "palatino bold", "palatino bold italic",
    "symbol",
    "zapf chancery medium italic",
    "zapf dingbats",
    "computer modern",
    "dejavu sans"
]
plts = [plot(sin, legend_font_family=f, label=f) for f in font_names]
plot(plts...; layout=(17,2), size=(1100, 950))

savefig("legend-font-family-02.png")

一応GRバックエンドの標準で指定できるのは以上になります。

注意点

注意すべき点は,Plots.fontの説明にある

  • family: AbstractString. "serif" or "sans-serif" or "monospace"

のうち,"serif","monospace"はGRバックエンドでは選べず,内部的にエラーが発生するところです。 「この嘘つき」と思わざるを得ないです。

ユーザー指定可能フォント

また,2023年の3月頃のバージョンからOSにインストールしたユーザー指定のTrueType(拡張子がttfの)フォントが選択可能となっています。

一応,

  • Linux用にはGRで選択できる日本語フォント名の配列を返す関数
  • Windows用にはGRで選択できるTrueTypeフォント名の配列を返す関数

のサンプルを用意してみました。

実装はネタ的な要素も含まれていて,いわゆるPlantUML方式です。(そんなのないです)

何というかパイプ演算子ネタで,2つ以上の変数では使いづらい等言われることもありますけど, 1変数の日本語関数に置き換えると日本人にとっては処理の流れが分かり易くて面白いですよね。

本当に使えるかどうかは自信がないので,もし利用する場合は自己責任でご利用下さい。

Macは持ってないので分かりません。ただ,Macはネットの情報とか見ると少々状況が異なっていて 「GR バックエンドの Plots.jl で日本語かけるでキュ!」 とかあるので,WindowsとかLinuxとかと違ってこんな情報を利用しなくてもうまくいっているのでしょう。多分。

"""
    ttfnames_gr_jp_linux()

PlotsのGRバックエンドで使える日本語フォント名文字列の配列を返す。
fc-listコマンドがインストールされたlinux環境で利用可能
"""
function ttfnames_gr_jp_linux()
    コマンド出力 = pipeline(`fc-list :lang=ja`, `grep ".ttf"`, `cut -d : -f 1`)
    読込(x) = read(x, String)
    終端改行削除(x) = chomp(x)
    行分割(x) = split(x, "\n")
    ファイル名抽出(x) = basename(x)
    拡張子削除(x) = chopsuffix(x, ".ttf")
    コマンド出力 |> 読込 |> 終端改行削除 |> 行分割 .|> ファイル名抽出 .|> 拡張子削除
end

"""
    ttfnames_gr_windows()
    
PlotsのGRバックエンドで使えるフォント名文字列の配列を返す。
Windows環境用
"""
function ttfnames_gr_windows()
    ttf抽出(x) = filter(c -> endswith(c, "ttf"), x)
    拡張子削除(x) = chopsuffix(x, ".ttf")
    フォントファイル名s = [
        readdir(joinpath(ENV["LOCALAPPDATA"], "microsoft", "windows", "fonts"));
        readdir(joinpath(ENV["SYSTEMROOT"], "fonts"))
    ]
    フォントファイル名s |> ttf抽出 .|> 拡張子削除
end

手持ちのlinux環境では次のような感じです。

# ttfnames_gr_jp_linux() をあらかじめ定義しておいて下さい
include("ttfnames_gr.jl")
using Plots

gr()

default(legend_position=(0.1, 0.5), legend_font_pointsize=10)
plts = [plot(sin, legend_font_family=f, label=f * " 日本語") for f in ttfnames_gr_jp_linux()]
plot(plts...; layout=(20, 3), size=(1100, 1100))

savefig("legend-font-family-03.png")

実は,インストール済みのJuiseeフォントやJuGeMフォントは日本語フォント判定されておらず, 相変わらず謎に包まれています。

とりあえず,legend_font_famly関係の持ちネタは以上です。