Handle matrices of annotations and copy for plot(plots) (#3572)

* add tests for series_annotations in layouts

* add methods for matrices of annotations

* defensive copy on plot(plots)

* seperate in plot(plots) and plot!(plots)
This commit is contained in:
Simon Christ 2021-06-17 09:29:39 +02:00 committed by GitHub
parent 7ca32b5edd
commit 2b22dae757
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 74 additions and 43 deletions

View File

@ -474,6 +474,11 @@ mutable struct SeriesAnnotations
baseshape::Union{Shape, AbstractVector{Shape}, Nothing} baseshape::Union{Shape, AbstractVector{Shape}, Nothing}
scalefactor::Tuple scalefactor::Tuple
end end
series_annotations(scalar) = series_annotations([scalar])
function series_annotations(anns::AMat)
map(series_annotations, anns)
end
function series_annotations(strs::AbstractVector, args...) function series_annotations(strs::AbstractVector, args...)
fnt = font() fnt = font()
shp = nothing shp = nothing
@ -570,6 +575,7 @@ end
annotations(::Nothing) = [] annotations(::Nothing) = []
annotations(anns::AVec) = anns annotations(anns::AVec) = anns
annotations(anns::AMat) = map(annotations, anns)
annotations(anns) = Any[anns] annotations(anns) = Any[anns]
annotations(sa::SeriesAnnotations) = sa annotations(sa::SeriesAnnotations) = sa

View File

@ -91,7 +91,8 @@ end
# build a new plot from existing plots # build a new plot from existing plots
# note: we split into plt1 and plts_tail so we can dispatch correctly # note: we split into plt1 and plts_tail so we can dispatch correctly
function plot(plt1::Plot, plts_tail::Plot...; kw...) plot(plt1::Plot, plts_tail::Plot...; kw...) = plot!(deepcopy(plt1), deepcopy.(plts_tail)...; kw...)
function plot!(plt1::Plot, plts_tail::Plot...; kw...)
@nospecialize @nospecialize
plotattributes = KW(kw) plotattributes = KW(kw)
RecipesPipeline.preprocess_attributes!(plotattributes) RecipesPipeline.preprocess_attributes!(plotattributes)

View File

@ -1,4 +1,4 @@
using Plots: guidefont using Plots: guidefont, series_annotations
import ImageMagick import ImageMagick
using VisualRegressionTests using VisualRegressionTests
using Plots using Plots

View File

@ -84,9 +84,17 @@ end
@testset "Fonts" begin @testset "Fonts" begin
@testset "Scaling" begin @testset "Scaling" begin
sizesToCheck = [:titlefontsize, :legendfontsize, :legendtitlefontsize, sizesToCheck = [
:xtickfontsize, :ytickfontsize, :ztickfontsize, :titlefontsize,
:xguidefontsize, :yguidefontsize, :zguidefontsize,] :legendfontsize,
:legendtitlefontsize,
:xtickfontsize,
:ytickfontsize,
:ztickfontsize,
:xguidefontsize,
:yguidefontsize,
:zguidefontsize,
]
# get inital font sizes # get inital font sizes
initialSizes = [Plots.default(s) for s in sizesToCheck] initialSizes = [Plots.default(s) for s in sizesToCheck]
@ -110,18 +118,34 @@ end
@testset "Series Annotations" begin @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 @test_logs (:warn, "Unused SeriesAnnotations arg: triangle (Symbol)") begin
p = plot([1,2,3], p = plot(
series_annotations=(["a"], [1, 2, 3],
series_annotations = (
["a"],
2, # pass a scale factor 2, # pass a scale factor
(1, 4), # pass two scale factors (overwrites first one) (1, 4), # pass two scale factors (overwrites first one)
square, # pass a shape square, # pass a shape
font(:courier), # pass an annotation font font(:courier), # pass an annotation font
:triangle # pass an incorrect argument :triangle, # pass an incorrect argument
)) ),
)
sa = p.series_list[1].plotattributes[:series_annotations] sa = p.series_list[1].plotattributes[:series_annotations]
@test sa.strs == ["a"] @test sa.strs == ["a"]
@test sa.font.family == "courier" @test sa.font.family == "courier"
@test sa.baseshape == square @test sa.baseshape == square
@test sa.scalefactor == (1, 4) @test sa.scalefactor == (1, 4)
end end
spl = scatter(
4.53 .* [1/1 1/2 1/3 1/4 1/5],
[0 0 0 0 0],
layout = (5, 1),
ylims = (-1.1, 1.1),
xlims = (0, 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"]
end end