Fix setting of legend font via legend_font (#3934)

* find pipeline spot

* better spot

* construct font

* set font and matching

* respect defaults
This commit is contained in:
Simon Christ 2021-11-11 09:48:29 +01:00 committed by Zhanibek
parent ec42b887d9
commit 3d88ff8595
5 changed files with 27 additions and 13 deletions

View File

@ -1484,7 +1484,7 @@ function RecipesPipeline.preprocess_attributes!(plotattributes::AKW)
# fonts # fonts
for fontname in for fontname in
(:titlefont, :legendfont, :legendtitlefont, :plot_titlefont, :colorbar_titlefont) (:titlefont, :legendtitlefont, :plot_titlefont, :colorbar_titlefont)
args = RecipesPipeline.pop_kw!(plotattributes, fontname, ()) args = RecipesPipeline.pop_kw!(plotattributes, fontname, ())
for arg in wraptuple(args) for arg in wraptuple(args)
processFontArg!(plotattributes, fontname, arg) processFontArg!(plotattributes, fontname, arg)
@ -1947,6 +1947,17 @@ function _update_subplot_colors(sp::Subplot)
return return
end end
function _update_subplot_legend(sp::Subplot, plotattributes_in)
f_attr = NamedTuple( k => plotattributes_in[Symbol(:legend_font_, k)] for k in (:family, :pointsize, :valign, :halign, :rotation, :color) if haskey(plotattributes_in, Symbol(:legend_font_, k)))
match_attr = NamedTuple( (lk = Symbol(:legend_font_, k); k => haskey(_match_map, lk) ? sp[lk] :
haskey(plotattributes_in, :legend_font) ? getproperty(plotattributes_in[:legend_font], k) :
default(plotattributes_in, lk))
for k in (:family, :pointsize, :valign, :halign, :rotation, :color))
sp.attr[:legend_font] = font(;
merge(match_attr, f_attr)...
)
end
function _update_axis( function _update_axis(
plt::Plot, plt::Plot,
sp::Subplot, sp::Subplot,

View File

@ -246,6 +246,7 @@ function font(args...; kw...)
for arg in args for arg in args
T = typeof(arg) T = typeof(arg)
@assert arg !== :match
if T == Font if T == Font
family = arg.family family = arg.family
@ -269,12 +270,12 @@ function font(args...; kw...)
catch catch
family = string(arg) family = string(arg)
end end
elseif typeof(arg) <: Integer elseif T <: Integer
pointsize = arg pointsize = arg
elseif typeof(arg) <: Real elseif T <: Real
rotation = convert(Float64, arg) rotation = convert(Float64, arg)
else else
@warn "Unused font arg: $arg ($(typeof(arg)))" @warn "Unused font arg: $arg ($T)"
end end
end end

View File

@ -263,6 +263,7 @@ function _subplot_setup(plt::Plot, plotattributes::AKW, kw_list::Vector{KW})
get(sp_attrs, sp, KW()) get(sp_attrs, sp, KW())
end end
_update_subplot_args(plt, sp, attr, idx, false) _update_subplot_args(plt, sp, attr, idx, false)
_update_subplot_legend(sp, attr)
end end
# do we need to link any axes together? # do we need to link any axes together?

View File

@ -994,14 +994,7 @@ titlefont(sp::Subplot) = font(;
color = sp[:titlefontcolor], color = sp[:titlefontcolor],
) )
legendfont(sp::Subplot) = font(; legendfont(sp::Subplot) = sp[:legend_font]
family = sp[:legend_font_family],
pointsize = sp[:legend_font_pointsize],
valign = sp[:legend_font_valign],
halign = sp[:legend_font_halign],
rotation = sp[:legend_font_rotation],
color = sp[:legend_font_color],
)
legendtitlefont(sp::Subplot) = font(; legendtitlefont(sp::Subplot) = font(;
family = sp[:legend_title_font_family], family = sp[:legend_title_font_family],

View File

@ -6,7 +6,7 @@ Plots.__init__()
@testset "Loading theme" begin @testset "Loading theme" begin
pl = plot(1:5) pl = plot(1:5)
@test pl[1][1][:seriescolor] == RGBA(colorant"black") @test pl[1][1][:seriescolor] == RGBA(colorant"black")
@test guidefont(pl[1][:xaxis]).family == "palantino" @test Plots.guidefont(pl[1][:xaxis]).family == "palantino"
end end
empty!(PLOTS_DEFAULTS) empty!(PLOTS_DEFAULTS)
@ -67,4 +67,12 @@ end # testset
@test p[1][:legend_title_font_color] == :blue @test p[1][:legend_title_font_color] == :blue
@test p[1][:legend_background_color] == RGBA{Float64}(0.0, 1.0, 1.0, 1.0) @test p[1][:legend_background_color] == RGBA{Float64}(0.0, 1.0, 1.0, 1.0)
@test p[1][:legend_foreground_color] == RGBA{Float64}(0.0, 0.5019607843137255, 0.0, 1.0) @test p[1][:legend_foreground_color] == RGBA{Float64}(0.0, 0.5019607843137255, 0.0, 1.0)
#setting whole font
sp = plot(1:5, legendfont=font(12), legend_font_halign = :left, foreground_color_subplot = :red)[1]
@test Plots.legendfont(sp).pointsize == 12
@test Plots.legendfont(sp).halign == :left
# match mechanism
@test sp[:legend_font_color] == sp[:foreground_color_subplot]
@test Plots.legendfont(sp).color == sp[:foreground_color_subplot]
end # testset end # testset