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

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

legend_font(|_halign|_valign)(Plots.jl(GR時々PGFPlotsX))

今回はようやく,legend_fontアトリビュートの説明です。

別名

そのものも含めて次の通りです。

  • legend_font
  • legend_fonts
  • legendfont
  • legendfonts

設定する内容

公式ドキュメントのSubplotアトリビュートを見ると,設定する内容はPlots.Font型です。

Plots.Fontの定義はPlots.jlのソースのこの辺りで,抜粋すると次のような感じです。

mutable struct Font
    family::AbstractString
    pointsize::Int
    halign::Symbol
    valign::Symbol
    rotation::Float64
    color::Colorant
end

で,halignvalign以外はこれまでに説明したアトリビュートの内容です。 ということはhalignvalignも設定可能なのはずなのですが, ソースのこの辺り を見ると,legendの場合halign=:leftvalign=:centerに固定で設定しています。

ここでは少し寄り道してlegend_font_halignlegend_font_valignについて説明します。 例は分かり易いlegend_font_halignで紹介します。

とさらにその前に比較用としてPGFPlotsXバックエンドについても少しだけ説明します。 PGFPlotsXも使ってみると結構面白いです。というか目的外使用の遊び場を見つけたというところでしょうか?

PGFPlotsXバックエンドの利用方法

良い子の学生の方(?)ならTeXLiveをインストールしていると思います。ubuntu(Not WSL(2))のライトなTeXユーザーならapt install texlive-fullで脳みそを使わずインストール可能です。

Windowsの場合も別途TexLiveをインストールしてパスを通します。

デフォルトでは日本語は使えないのですが, PGFPlotsX.CUSTOM_PREAMBLE\usepackage{luatexja}を追加するという裏技(?)が使えます。 ここでは,PGFPlotsX.CUSTOM_PREAMBLEに直接文字列の配列を設定していますが, 公式ドキュメントではpush!(PGFPlotsX.CUSTOM_PREAMBLE, "文字列")という感じで利用することが推奨されています。

import PGFPlotsX
using Plots
pgfplotsx()
PGFPlotsX.CUSTOM_PREAMBLE=[]
plot(sin; label="正弦波")
savefig("pgfplotsx_no_preamble.png")

import PGFPlotsX
using Plots
pgfplotsx()
PGFPlotsX.CUSTOM_PREAMBLE=[raw"\usepackage{luatexja}"]
plot(sin; label="正弦波")
savefig("pgfplotsx_add_preamble.png")

legend_font_halign(GRバックエンドでは機能せず)

とりあえず,ほぼ同じソースでhalignに各パラメータを設定してみます。

import PGFPlotsX
using Plots

begin
    gr()
    plts = [
        plot([sin, cos]; legend_font_halign=halign, label=["sinsinsin" "cos"],
             legend_position=(0.5, 0.5), title=string(halign))
             for halign in [:left, :center, :hcenter, :right]]
    plt = plot(plts...; plot_title="legend_font_halign(GR)")
    savefig(plt, "legend_font_halign_gr.png")
end

begin
    pgfplotsx()
    plts = [
        plot([sin, cos]; legend_font_halign=halign, label=["sinsinsin" "cos"],
             legend_position=(0.5, 0.5), title=string(halign))
        for halign in [:left, :center, :hcenter, :right]]
    plt = plot(plts...; plot_title="legend_font_halign(PGFPlotsX)")
    savefig(plt, "legend_font_halign_pgfplotsx.png")
end

PGFPlotsXの場合は,短い文字列の位置が変化するのに対し,GRバックエンドでは変化しません。 このあたりには注意が必要ですが,左詰め固定を変更する必要性もあまりないのでは?と思うところではあります。

また,凡例の基準となる座標が,PGFPlotsXは凡例の四角の左上なのに対し,GRでは一つ目の凡例の文字の左真ん中で, バックエンドによって実装の動きが違うのが面白いところです。

Plots.FontPlots.font (GRバックエンド)

Plots.Font型は複合型で,前述の通り6個の引数を設定する必要があります。 試しにフォントだけ引数に入れて呼び出してみると次のようなエラーが出ます。

julia> myfont = Plots.Font("JuiseeHWSZ-Regular")
ERROR: MethodError: no method matching Plots.Font(::String)

Closest candidates are:
  Plots.Font(::AbstractString, ::Int64, ::Symbol, ::Symbol, ::Float64, ::Colorant)
   @ Plots ~/.julia/packages/Plots/HyyIK/src/components.jl:215
  Plots.Font(::Any, ::Any, ::Any, ::Any, ::Any, ::Any)
   @ Plots ~/.julia/packages/Plots/HyyIK/src/components.jl:215

Plotsにはfont関数が用意されていて,これを使うとパラメータ指定でFont型を定義できます。

REPLから実行すると次のような感じになります。

julia> myfont = font(family="JuiseeHWSZ-Regular")
Plots.Font("JuiseeHWSZ-Regular", 14, :hcenter, :vcenter, 0.0, RGB{N0f8}(0.0,0.0,0.0))

julia> myfont = font(family="JuiseeHWSZ-Regular", pointsize=8, color=:blue)
Plots.Font("JuiseeHWSZ-Regular", 8, :hcenter, :vcenter, 0.0, RGB{N0f8}(0.0,0.0,1.0))

設定しないパラメータはデフォルトの値で設定されるようです。pointsizeが14ということはタイトル指定を 想定している動作ですかね。

:hcenter:vcenterは前述の通り凡例では表示に反映されません。

なお,PGFPlotsXは公式ドキュメントでは対応してないということですが,今回の日記では試していません。

使用例

最後に使用例です。といっても,これまでのlegend_font_*シリーズと何ら変わらないので, 色とサイズだけ変えたものをサンプルにのせます。

using Plots
gr()

params = [(x, y) for x in [:red, :blue, :green], y in 6:2:12]
plts = [plot(sin; label="$(p[1]), $(p[2])", legend_position=(0.1, 0.5),
             legend_font=font(color=p[1], pointsize=p[2])) for p in params]
plt = plot(plts..., plot_title="legend_font", layout=(4, 3), size=(480, 640))

savefig(plt, "legend-font-example.png")