diff --git a/src/arg_desc.jl b/src/arg_desc.jl index a8decf79..67411988 100644 --- a/src/arg_desc.jl +++ b/src/arg_desc.jl @@ -116,6 +116,12 @@ const _arg_desc = KW( :legendfont => "Font. Font of legend items.", :legendtitlefont => "Font. Font of the legend title.", :annotations => "(x,y,text) tuple(s). Can be a single tuple or a list of them. Text can be String or PlotText (created with `text(args...)`) Add one-off text annotations at the x,y coordinates.", +:annotationfontfamily => "String or Symbol. Font family of annotations.", +:annotationfontsize => "Integer. Font pointsize of annotations.", +:annotationhalign => "Symbol. horizontal alignment of annotations, :hcenter, :left, :right or :center.", +:annotationvalign => "Symbol. Vertical alignment of annotations, :vcenter, :top, :bottom or :center.", +:annotationrotation => "Float. Rotation of annotations in degrees.", +:annotationcolor => "Colorant or :match. Color of annotations.", :projection => "Symbol or String. '3d' or 'polar'", :aspect_ratio => "Symbol (:equal or :none) or Number. Plot area is resized so that 1 y-unit is the same size as `aspect_ratio` x-units. With `:none`, images inherit aspect ratio of the plot area.", :margin => "Measure (multiply by `mm`, `px`, etc). Base for individual margins... not directly used. Specifies the extra padding around subplots.", diff --git a/src/args.jl b/src/args.jl index 12e75cdd..d00cf8b9 100644 --- a/src/args.jl +++ b/src/args.jl @@ -408,6 +408,12 @@ const _subplot_defaults = KW( :legendtitlefontrotation => 0.0, :legendtitlefontcolor => :match, :annotations => [], # annotation tuples... list of (x,y,annotation) + :annotationfontfamily => :match, + :annotationfontsize => 14, + :annotationhalign => :hcenter, + :annotationvalign => :vcenter, + :annotationrotation => 0.0, + :annotationcolor => :match, :projection => :none, # can also be :polar or :3d :aspect_ratio => :auto, # choose from :none or :equal :margin => 1mm, @@ -519,6 +525,7 @@ const _initial_axis_defaults = deepcopy(_axis_defaults) const _initial_fontsizes = Dict(:titlefontsize => _subplot_defaults[:titlefontsize], :legendfontsize => _subplot_defaults[:legendfontsize], :legendtitlefontsize => _subplot_defaults[:legendtitlefontsize], + :annotationfontsize => _subplot_defaults[:annotationfontsize], :tickfontsize => _axis_defaults[:tickfontsize], :guidefontsize => _axis_defaults[:guidefontsize]) @@ -1359,6 +1366,8 @@ const _match_map = KW( :plot_titlefontcolor => :foreground_color, :tickfontcolor => :foreground_color_text, :guidefontcolor => :foreground_color_guide, + :annotationfontfamily => :fontfamily_subplot, + :annotationcolor => :foreground_color_subplot, ) # these can match values from the parent container (axis --> subplot --> plot) diff --git a/src/components.jl b/src/components.jl index d7a6c98b..34cafdc4 100644 --- a/src/components.jl +++ b/src/components.jl @@ -575,11 +575,21 @@ annotations(sa::SeriesAnnotations) = sa # Expand arrays of coordinates, positions and labels into induvidual annotations # and make sure labels are of type PlotText -function process_annotation(sp::Subplot, xs, ys, labs, font = font()) +function process_annotation(sp::Subplot, xs, ys, labs, font = nothing) anns = [] labs = makevec(labs) xlength = length(methods(length, (typeof(xs),))) == 0 ? 1 : length(xs) ylength = length(methods(length, (typeof(ys),))) == 0 ? 1 : length(ys) + if isnothing(font) + font = Plots.font(; + family=sp[:annotationfontfamily], + pointsize=sp[:annotationfontsize], + halign=sp[:annotationhalign], + valign=sp[:annotationvalign], + rotation=sp[:annotationrotation], + color=sp[:annotationcolor], + ) + end for i in 1:max(xlength, ylength, length(labs)) x, y, lab = _cycle(xs, i), _cycle(ys, i), _cycle(labs, i) x = typeof(x) <: TimeType ? Dates.value(x) : x @@ -588,14 +598,24 @@ function process_annotation(sp::Subplot, xs, ys, labs, font = font()) alphabet = "abcdefghijklmnopqrstuvwxyz" push!(anns, (x, y, text(string("(", alphabet[sp[:subplot_index]], ")"), font))) else - push!(anns, (x, y, isa(lab, PlotText) ? lab : isa(lab, Tuple) ? text(lab...) : text(lab, font))) + push!(anns, (x, y, isa(lab, PlotText) ? lab : isa(lab, Tuple) ? text(lab[1], font, lab[2:end]...) : text(lab, font))) end end anns end -function process_annotation(sp::Subplot, positions::Union{AVec{Symbol},Symbol}, labs, font = font()) +function process_annotation(sp::Subplot, positions::Union{AVec{Symbol},Symbol}, labs, font = nothing) anns = [] positions, labs = makevec(positions), makevec(labs) + if isnothing(font) + font = Plots.font(; + family=sp[:annotationfontfamily], + pointsize=sp[:annotationfontsize], + halign=sp[:annotationhalign], + valign=sp[:annotationvalign], + rotation=sp[:annotationrotation], + color=sp[:annotationcolor], + ) + end for i in 1:max(length(positions), length(labs)) pos, lab = _cycle(positions, i), _cycle(labs, i) pos = get(_positionAliases, pos, pos) @@ -603,7 +623,7 @@ function process_annotation(sp::Subplot, positions::Union{AVec{Symbol},Symbol}, alphabet = "abcdefghijklmnopqrstuvwxyz" push!(anns, (pos, text(string("(", alphabet[sp[:subplot_index]], ")"), font))) else - push!(anns, (pos, isa(lab, PlotText) ? lab : isa(lab, Tuple) ? text(lab...) : text(lab, font))) + push!(anns, (pos, isa(lab, PlotText) ? lab : isa(lab, Tuple) ? text(lab[1], font, lab[2:end]...) : text(lab, font))) end end anns