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:
parent
7ca32b5edd
commit
2b22dae757
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
using Plots: guidefont
|
using Plots: guidefont, series_annotations
|
||||||
import ImageMagick
|
import ImageMagick
|
||||||
using VisualRegressionTests
|
using VisualRegressionTests
|
||||||
using Plots
|
using Plots
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user