Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
a05d31a472
@ -1,7 +1,7 @@
|
|||||||
name = "Plots"
|
name = "Plots"
|
||||||
uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
|
uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
|
||||||
author = ["Tom Breloff (@tbreloff)"]
|
author = ["Tom Breloff (@tbreloff)"]
|
||||||
version = "1.0.0"
|
version = "1.0.3"
|
||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
|
Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
|
||||||
@ -53,12 +53,12 @@ julia = "1"
|
|||||||
FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549"
|
FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549"
|
||||||
GeometryTypes = "4d00f742-c7ba-57c2-abde-4428a4b178cb"
|
GeometryTypes = "4d00f742-c7ba-57c2-abde-4428a4b178cb"
|
||||||
Gtk = "4c0ca9eb-093a-5379-98c5-f87ac0bbbf44"
|
Gtk = "4c0ca9eb-093a-5379-98c5-f87ac0bbbf44"
|
||||||
|
HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f"
|
||||||
ImageMagick = "6218d12a-5da1-5696-b52f-db25d2ecc6d1"
|
ImageMagick = "6218d12a-5da1-5696-b52f-db25d2ecc6d1"
|
||||||
Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0"
|
Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0"
|
||||||
LibGit2 = "76f85450-5226-5b5a-8eaa-529ad045b433"
|
LibGit2 = "76f85450-5226-5b5a-8eaa-529ad045b433"
|
||||||
OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
|
OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
|
||||||
PGFPlotsX = "8314cec4-20b6-5062-9cdb-752b83310925"
|
PGFPlotsX = "8314cec4-20b6-5062-9cdb-752b83310925"
|
||||||
HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f"
|
|
||||||
RDatasets = "ce6b1742-4840-55fa-b093-852dadbb1d8b"
|
RDatasets = "ce6b1742-4840-55fa-b093-852dadbb1d8b"
|
||||||
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
|
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
|
||||||
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
|
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
|
||||||
|
|||||||
@ -1,5 +1,9 @@
|
|||||||
module Plots
|
module Plots
|
||||||
|
|
||||||
|
if isdefined(Base, :Experimental) && isdefined(Base.Experimental, Symbol("@optlevel"))
|
||||||
|
@eval Base.Experimental.@optlevel 1
|
||||||
|
end
|
||||||
|
|
||||||
const _current_plots_version = VersionNumber(split(first(filter(line -> occursin("version", line), readlines(normpath(@__DIR__, "..", "Project.toml")))), "\"")[2])
|
const _current_plots_version = VersionNumber(split(first(filter(line -> occursin("version", line), readlines(normpath(@__DIR__, "..", "Project.toml")))), "\"")[2])
|
||||||
|
|
||||||
using Reexport
|
using Reexport
|
||||||
|
|||||||
@ -1015,7 +1015,7 @@ function preprocessArgs!(plotattributes::AKW)
|
|||||||
end
|
end
|
||||||
# handle axes args
|
# handle axes args
|
||||||
for k in _axis_args
|
for k in _axis_args
|
||||||
if haskey(plotattributes, k)
|
if haskey(plotattributes, k) && k !== :link
|
||||||
v = plotattributes[k]
|
v = plotattributes[k]
|
||||||
for letter in (:x, :y, :z)
|
for letter in (:x, :y, :z)
|
||||||
lk = Symbol(letter, k)
|
lk = Symbol(letter, k)
|
||||||
|
|||||||
@ -352,17 +352,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend})
|
|||||||
series_index,
|
series_index,
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
# add series annotations
|
|
||||||
anns = series[:series_annotations]
|
|
||||||
for (xi, yi, str, fnt) in EachAnn(anns, series[:x], series[:y])
|
|
||||||
pgfx_add_annotation!(
|
|
||||||
axis,
|
|
||||||
xi,
|
|
||||||
yi,
|
|
||||||
PlotText(str, fnt),
|
|
||||||
pgfx_thickness_scaling(series),
|
|
||||||
)
|
|
||||||
end
|
|
||||||
# add to legend?
|
# add to legend?
|
||||||
if sp[:legend] != :none
|
if sp[:legend] != :none
|
||||||
leg_entry = if opt[:label] isa AVec
|
leg_entry = if opt[:label] isa AVec
|
||||||
@ -388,6 +377,18 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend})
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end # for segments
|
end # for segments
|
||||||
|
# add series annotations
|
||||||
|
anns = series[:series_annotations]
|
||||||
|
for (xi, yi, str, fnt) in EachAnn(anns, series[:x], series[:y])
|
||||||
|
pgfx_add_annotation!(
|
||||||
|
axis,
|
||||||
|
xi,
|
||||||
|
yi,
|
||||||
|
PlotText(str, fnt),
|
||||||
|
pgfx_thickness_scaling(series),
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end # for series
|
||||||
# add subplot annotations
|
# add subplot annotations
|
||||||
for ann in sp[:annotations]
|
for ann in sp[:annotations]
|
||||||
pgfx_add_annotation!(
|
pgfx_add_annotation!(
|
||||||
@ -396,7 +397,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend})
|
|||||||
pgfx_thickness_scaling(sp),
|
pgfx_thickness_scaling(sp),
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
end # for series
|
|
||||||
push!(the_plot, axis)
|
push!(the_plot, axis)
|
||||||
if length(plt.o.the_plot.elements) > 0
|
if length(plt.o.the_plot.elements) > 0
|
||||||
plt.o.the_plot.elements[1] = the_plot
|
plt.o.the_plot.elements[1] = the_plot
|
||||||
@ -405,6 +405,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend})
|
|||||||
end
|
end
|
||||||
end # for subplots
|
end # for subplots
|
||||||
pgfx_plot.is_created = true
|
pgfx_plot.is_created = true
|
||||||
|
pgfx_plot.was_shown = false
|
||||||
end # if
|
end # if
|
||||||
return pgfx_plot
|
return pgfx_plot
|
||||||
end
|
end
|
||||||
@ -900,6 +901,15 @@ function pgfx_sanitize_string(s::AbstractString)
|
|||||||
s = replace(s, r"\\?\%" => "\\%")
|
s = replace(s, r"\\?\%" => "\\%")
|
||||||
s = replace(s, r"\\?\_" => "\\_")
|
s = replace(s, r"\\?\_" => "\\_")
|
||||||
s = replace(s, r"\\?\&" => "\\&")
|
s = replace(s, r"\\?\&" => "\\&")
|
||||||
|
s = replace(s, r"\\?\{" => "\\{")
|
||||||
|
s = replace(s, r"\\?\}" => "\\}")
|
||||||
|
end
|
||||||
|
@require LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" begin
|
||||||
|
using LaTeXStrings
|
||||||
|
function pgfx_sanitize_string(s::LaTeXString)
|
||||||
|
s = replace(s, r"\\?\#" => "\\#")
|
||||||
|
s = replace(s, r"\\?\%" => "\\%")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
function pgfx_sanitize_plot!(plt)
|
function pgfx_sanitize_plot!(plt)
|
||||||
for (key, value) in plt.attr
|
for (key, value) in plt.attr
|
||||||
|
|||||||
@ -934,6 +934,18 @@ const _examples = PlotExample[
|
|||||||
end,
|
end,
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
PlotExample(
|
||||||
|
"Linked axes",
|
||||||
|
"",
|
||||||
|
[
|
||||||
|
quote
|
||||||
|
begin
|
||||||
|
x = -5:0.1:5
|
||||||
|
plot(plot(x, x->x^2), plot(x, x->sin(x)), layout = 2, link = :y)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
],
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
# Some constants for PlotDocs and PlotReferenceImages
|
# Some constants for PlotDocs and PlotReferenceImages
|
||||||
|
|||||||
@ -216,7 +216,10 @@ function _apply_type_recipe(plotattributes, v::AbstractArray, letter)
|
|||||||
end
|
end
|
||||||
|
|
||||||
# special handling for Surface... need to properly unwrap and re-wrap
|
# special handling for Surface... need to properly unwrap and re-wrap
|
||||||
_apply_type_recipe(plotattributes, v::Surface{<:AMat{<:DataPoint}}) = v
|
_apply_type_recipe(
|
||||||
|
plotattributes,
|
||||||
|
v::Surface{<:AMat{<:Union{AbstractFloat, Integer, AbstractString, Missing}}},
|
||||||
|
) = v
|
||||||
function _apply_type_recipe(plotattributes, v::Surface)
|
function _apply_type_recipe(plotattributes, v::Surface)
|
||||||
ret = _apply_type_recipe(plotattributes, v.surf)
|
ret = _apply_type_recipe(plotattributes, v.surf)
|
||||||
if typeof(ret) <: Formatted
|
if typeof(ret) <: Formatted
|
||||||
@ -226,9 +229,13 @@ function _apply_type_recipe(plotattributes, v::Surface)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# don't do anything for datapoints or nothing
|
# don't do anything vectors of datapoints and for nothing
|
||||||
_apply_type_recipe(plotattributes, v::AbstractArray{<:DataPoint}, letter) = v
|
|
||||||
_apply_type_recipe(plotattributes, v::Nothing, letter) = v
|
_apply_type_recipe(plotattributes, v::Nothing, letter) = v
|
||||||
|
_apply_type_recipe(
|
||||||
|
plotattributes,
|
||||||
|
v::AbstractArray{<:Union{AbstractFloat, Integer, AbstractString, Missing}},
|
||||||
|
letter,
|
||||||
|
) = v
|
||||||
|
|
||||||
# axis args before type recipes should still be mapped to all axes
|
# axis args before type recipes should still be mapped to all axes
|
||||||
function _preprocess_axis_args!(plotattributes)
|
function _preprocess_axis_args!(plotattributes)
|
||||||
|
|||||||
@ -438,7 +438,7 @@ julia> plot(1:10)
|
|||||||
julia> annotate!([(7,3,"(7,3)"),(3,7,text("hey", 14, :left, :top, :green))])
|
julia> annotate!([(7,3,"(7,3)"),(3,7,text("hey", 14, :left, :top, :green))])
|
||||||
```
|
```
|
||||||
"""
|
"""
|
||||||
annotate!(anns...; kw...) = plot!(; annotation = anns, kw...)
|
annotate!(anns...; kw...) = plot!(; annotation = collect(anns), kw...)
|
||||||
annotate!(anns::AVec{T}; kw...) where {T<:Tuple} = plot!(; annotation = anns, kw...)
|
annotate!(anns::AVec{T}; kw...) where {T<:Tuple} = plot!(; annotation = anns, kw...)
|
||||||
|
|
||||||
"Flip the current plots' x axis"
|
"Flip the current plots' x axis"
|
||||||
|
|||||||
@ -245,15 +245,39 @@ end
|
|||||||
end # testset
|
end # testset
|
||||||
@testset "Annotations" begin
|
@testset "Annotations" begin
|
||||||
y = rand(10)
|
y = rand(10)
|
||||||
plot(
|
pgfx_plot = plot(
|
||||||
y,
|
y,
|
||||||
annotations = (3, y[3], Plots.text("this is \\#3", :left)),
|
annotations = (3, y[3], Plots.text("this is \\#3", :left)),
|
||||||
leg = false,
|
leg = false,
|
||||||
)
|
)
|
||||||
|
Plots._update_plot_object(pgfx_plot)
|
||||||
|
axis_content = Plots.pgfx_axes(pgfx_plot.o)[1].contents
|
||||||
|
nodes = filter(x -> !isa(x, PGFPlotsX.Plot), axis_content)
|
||||||
|
@test length(nodes) == 1
|
||||||
|
mktempdir() do path
|
||||||
|
file_path =joinpath(path,"annotations.tex")
|
||||||
|
@test_nowarn savefig(pgfx_plot, file_path)
|
||||||
|
open(file_path) do io
|
||||||
|
lines = readlines(io)
|
||||||
|
@test count(s -> occursin("node", s), lines) == 1
|
||||||
|
end
|
||||||
|
end
|
||||||
annotate!([
|
annotate!([
|
||||||
(5, y[5], Plots.text("this is \\#5", 16, :red, :center)),
|
(5, y[5], Plots.text("this is \\#5", 16, :red, :center)),
|
||||||
(10, y[10], Plots.text("this is \\#10", :right, 20, "courier")),
|
(10, y[10], Plots.text("this is \\#10", :right, 20, "courier")),
|
||||||
])
|
])
|
||||||
|
Plots._update_plot_object(pgfx_plot)
|
||||||
|
axis_content = Plots.pgfx_axes(pgfx_plot.o)[1].contents
|
||||||
|
nodes = filter(x -> !isa(x, PGFPlotsX.Plot), axis_content)
|
||||||
|
@test length(nodes) == 3
|
||||||
|
mktempdir() do path
|
||||||
|
file_path =joinpath(path,"annotations.tex")
|
||||||
|
@test_nowarn savefig(pgfx_plot, file_path)
|
||||||
|
open(file_path) do io
|
||||||
|
lines = readlines(io)
|
||||||
|
@test count(s -> occursin("node", s), lines) == 3
|
||||||
|
end
|
||||||
|
end
|
||||||
annotation_plot = scatter!(
|
annotation_plot = scatter!(
|
||||||
range(2, stop = 8, length = 6),
|
range(2, stop = 8, length = 6),
|
||||||
rand(6),
|
rand(6),
|
||||||
@ -267,9 +291,18 @@ end
|
|||||||
Plots.text("data", :green),
|
Plots.text("data", :green),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
# mktempdir() do path
|
Plots._update_plot_object(annotation_plot)
|
||||||
# @test_nowarn savefig(annotation_plot, path*"annotation.pdf")
|
axis_content = Plots.pgfx_axes(annotation_plot.o)[1].contents
|
||||||
# end
|
nodes = filter(x -> !isa(x, PGFPlotsX.Plot), axis_content)
|
||||||
|
@test length(nodes) == 9
|
||||||
|
mktempdir() do path
|
||||||
|
file_path =joinpath(path,"annotations.tex")
|
||||||
|
@test_nowarn savefig(annotation_plot, file_path)
|
||||||
|
open(file_path) do io
|
||||||
|
lines = readlines(io)
|
||||||
|
@test count(s -> occursin("node", s), lines) == 9
|
||||||
|
end
|
||||||
|
end
|
||||||
end # testset
|
end # testset
|
||||||
@testset "Ribbon" begin
|
@testset "Ribbon" begin
|
||||||
aa = rand(10)
|
aa = rand(10)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user