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

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

Plots.jl Ver.2 (GR)用フォントパッチ(Linux用)

いまだに正式リリースされていないPlots.jl Ver.2用に 先日紹介したPlots.jlのGRバックエンド用フォントパッチ(Linux用)を移植した。

誰の役にも立たない情報であるが,いつかバージョン2が出た時の自分のために記録しておく。 といっても,バージョン1よりもGR用のラッパーの位置が分かりづらくなっているだけで, 基本的にはあまり変わらない。

# plots_v2_gr_font_patch_for_linux.jl

# using Pkg
# plotsv2_env = "/home/ujimushi/test"
# Pkg.activate(plotsv2_env)

using Plots
import GR

MyGR = PlotsBase.get_backend_module(:GR)[1]

@eval MyGR begin
    function gr_custom_fontlist_linux()
        コマンド出力 = pipeline(`fc-list`, `egrep "[.](ttf|ttc|otf)"`,`cut -d : -f 1`)
        読込(x) = read(x, String)
        終端改行削除(x) = chomp(x)
        行分割(x) = split(x, "\n")
        ファイル名抽出(x) = basename(x)
        fnames = コマンド出力 |> 読込 |> 終端改行削除 |> 行分割 .|> ファイル名抽出
        Dict([(chopsuffix(f, r"[.](ttf|ttc|otf)") , f) for f in fnames])
    end
    
    """
        パッチで指定可能なフォント名 => ファイル名の辞書型

    `"フォント名" in keys(PlotsBase.get_backend_module(:GR)[1].gr_custom_fontlist)`
    でフォントが選択可能か分かる
    """
    const gr_custom_fontlist = gr_custom_fontlist_linux()
    
    function gr_set_font(
        f::Font, s; halign = f.halign, valign = f.valign, color = f.color,
        rotation = f.rotation,)
        _MyGR = Plots.PlotsBase.get_backend_module(:GR)[1]
        family = lowercase(f.family)
        GR.setcharheight(_MyGR.gr_point_mult(s) * f.pointsize)
        GR.setcharup(sincosd(-rotation)...)
        if !haskey(_MyGR.gr_font_family, family)
            # この辺を変更
            _MyGR.gr_font_family[family] = GR.loadfont(gr_custom_fontlist[f.family])
        end
        haskey(_MyGR.gr_font_family, family) && GR.settextfontprec(
            _MyGR.gr_font_family[family],
            _MyGR.gr_font_family[family]  200 ? 3 : GR.TEXT_PRECISION_STRING,
        )
        _MyGR.gr_set_textcolor(plot_color(color))
        GR.settextalign(gr_haligns[halign], gr_valigns[valign])
        nothing
    end
end

使う時は上記のファイルをインクルードして必ずgr()する必要がある。 前回も記述したが存在しないフォント名を指定するとエラーで終了するので注意。