diff --git a/src/args.jl b/src/args.jl index 5e624c0c..d4c0eb0e 100644 --- a/src/args.jl +++ b/src/args.jl @@ -996,9 +996,9 @@ function processFontArg!(plotattributes::AKW, fontname::Symbol, arg) elseif arg == :center plotattributes[Symbol(fontname, :halign)] = :hcenter plotattributes[Symbol(fontname, :valign)] = :vcenter - elseif arg in (:hcenter, :left, :right) + elseif arg ∈ _haligns plotattributes[Symbol(fontname, :halign)] = arg - elseif arg in (:vcenter, :top, :bottom) + elseif arg ∈ _valigns plotattributes[Symbol(fontname, :valign)] = arg elseif T <: Colorant plotattributes[Symbol(fontname, :color)] = arg diff --git a/src/backends.jl b/src/backends.jl index a82efca5..d75967a4 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -70,6 +70,7 @@ function text_size(lablen::Int, sz::Number, rot::Number = 0) width, height end text_size(lab::AbstractString, sz::Number, rot::Number = 0) = text_size(length(lab), sz, rot) +text_size(lab::PlotText, sz::Number, rot::Number = 0) = text_size(length(lab.str), sz, rot) # account for the size/length/rotation of tick labels function tick_padding(sp::Subplot, axis::Axis) diff --git a/src/components.jl b/src/components.jl index 2f76a2fa..c95b51ea 100644 --- a/src/components.jl +++ b/src/components.jl @@ -475,10 +475,15 @@ mutable struct SeriesAnnotations scalefactor::Tuple end +_text_label(lab::Tuple, font) = text(lab[1], font, lab[2:end]...) +_text_label(lab::PlotText, font) = lab +_text_label(lab, font) = text(lab, font) + +series_annotations(anns::AMat) = map(series_annotations, anns) series_annotations(scalar) = series_annotations([scalar]) -function series_annotations(anns::AMat) - map(series_annotations, anns) -end +series_annotations(anns::SeriesAnnotations) = anns +series_annotations(::Nothing) = nothing + function series_annotations(strs::AbstractVector, args...) fnt = font() shp = nothing @@ -503,10 +508,8 @@ function series_annotations(strs::AbstractVector, args...) # scale!(s, scalefactor, scalefactor, (0,0)) # end # end - SeriesAnnotations(strs, fnt, shp, scalefactor) + SeriesAnnotations([_text_label(s, fnt) for s ∈ strs], fnt, shp, scalefactor) end -series_annotations(anns::SeriesAnnotations) = anns -series_annotations(::Nothing) = nothing function series_annotations_shapes!(series::Series, scaletype::Symbol = :pixels) anns = series[:series_annotations] @@ -574,11 +577,11 @@ function Base.iterate(ea::EachAnn, i = 1) end # ----------------------------------------------------------------------- -annotations(::Nothing) = [] -annotations(anns::AVec) = anns annotations(anns::AMat) = map(annotations, anns) -annotations(anns) = Any[anns] annotations(sa::SeriesAnnotations) = sa +annotations(anns::AVec) = anns +annotations(anns) = Any[anns] +annotations(::Nothing) = [] _annotationfont(sp::Subplot) = Plots.font(; family=sp[:annotationfontfamily], @@ -589,12 +592,9 @@ _annotationfont(sp::Subplot) = Plots.font(; color=sp[:annotationcolor], ) -_annotation(sp, font, lab, pos...; alphabet="abcdefghijklmnopqrstuvwxyz") = ( - if lab == :auto - (pos..., text("($(alphabet[sp[:subplot_index]]))", font)) - else - (pos..., isa(lab, PlotText) ? lab : isa(lab, Tuple) ? text(lab[1], font, lab[2:end]...) : text(lab, font)) - end +_annotation(sp::Subplot, font, lab, pos...; alphabet="abcdefghijklmnopqrstuvwxyz") = ( + pos..., + lab == :auto ? text("($(alphabet[sp[:subplot_index]]))", font) : _text_label(lab, font) ) # Expand arrays of coordinates, positions and labels into induvidual annotations @@ -623,8 +623,6 @@ function process_annotation(sp::Subplot, positions::Union{AVec{Symbol},Symbol,Tu anns end -process_any_label(lab, font=Font()) = lab isa Tuple ? text(lab...) : text(lab, font) - _relative_position(xmin, xmax, pos::Length{:pct}) = xmin + pos.value * (xmax - xmin) # Give each annotation coordinates based on specified position diff --git a/test/test_components.jl b/test/test_components.jl index 2cb2a931..aae50da3 100644 --- a/test/test_components.jl +++ b/test/test_components.jl @@ -116,7 +116,7 @@ end end @testset "Series Annotations" begin - square = Shape([(0, 0), (1, 0), (1, 1), (0, 1)]) + square = Shape([(0., 0.), (1., 0.), (1., 1.), (0., 1.)]) @test_logs (:warn, "Unused SeriesAnnotations arg: triangle (Symbol)") begin p = plot( [1, 2, 3], @@ -130,7 +130,7 @@ end ), ) sa = p.series_list[1].plotattributes[:series_annotations] - @test sa.strs == ["a"] + @test only(sa.strs).str == "a" @test sa.font.family == "courier" @test sa.baseshape == square @test sa.scalefactor == (1, 4) @@ -141,21 +141,19 @@ end layout = (5, 1), ylims = (-1.1, 1.1), xlims = (0, 5), - series_annotations = permutedims([["1/1"],["1/2"],["1/3"],["1/4"],["1/5"]]), + series_annotations = permutedims([["1/1"], ["1/2"], ["1/3"], ["1/4"], ["1/5"]]), ) - @test spl.series_list[1].plotattributes[:series_annotations].strs == ["1/1"] - @test spl.series_list[2].plotattributes[:series_annotations].strs == ["1/2"] - @test spl.series_list[3].plotattributes[:series_annotations].strs == ["1/3"] - @test spl.series_list[4].plotattributes[:series_annotations].strs == ["1/4"] - @test spl.series_list[5].plotattributes[:series_annotations].strs == ["1/5"] + for i ∈ 1:5 + @test only(spl.series_list[i].plotattributes[:series_annotations].strs).str == "1/$i" + end p = plot([1, 2], annotations=(1.5, 2, text("foo", :left))) - x, y, txt = p.subplots[end][:annotations][end] + x, y, txt = only(p.subplots[end][:annotations]) @test (x, y) == (1.5, 2) @test txt.str == "foo" p = plot([1, 2], annotations=((.1, .5), :auto)) - pos, txt = p.subplots[end][:annotations][end] + pos, txt = only(p.subplots[end][:annotations]) @test pos == (.1, .5) @test txt.str == "(a)" end