Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fe21c4de89 | ||
|
|
8dd2a7d099 | ||
|
|
14e78e7235 |
@@ -40,7 +40,7 @@ jobs:
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
julia --project -e 'using Pkg; Pkg.instantiate();'
|
||||
julia -e 'using Pkg; Pkg.add( PackageSpec(name = "CompileBot", version = "1") ); Pkg.develop(PackageSpec(; path=pwd())); using CompileBot; CompileBot.addtestdep();'
|
||||
julia -e 'using Pkg; Pkg.add( PackageSpec(url="https://github.com/aminya/CompileBot.jl", rev = "master") ); Pkg.develop(PackageSpec(; path=pwd())); using CompileBot; CompileBot.addtestdep();'
|
||||
|
||||
|
||||
# TESTCMD
|
||||
@@ -73,7 +73,7 @@ jobs:
|
||||
uses: actions/download-artifact@v2
|
||||
|
||||
- name: CompileBot postprocess
|
||||
run: julia -e 'using Pkg; Pkg.add( PackageSpec(name = "CompileBot", version = "1") ); using CompileBot; CompileBot.postprocess();'
|
||||
run: julia -e 'using Pkg; Pkg.add( PackageSpec(url="https://github.com/aminya/CompileBot.jl", rev = "master") ); using CompileBot; CompileBot.postprocess();'
|
||||
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v3
|
||||
|
||||
+1
-1
@@ -189,9 +189,9 @@ import RecipesPipeline: SliceIt,
|
||||
|
||||
include("types.jl")
|
||||
include("utils.jl")
|
||||
include("components.jl")
|
||||
include("axes.jl")
|
||||
include("args.jl")
|
||||
include("components.jl")
|
||||
include("themes.jl")
|
||||
include("plot.jl")
|
||||
include("pipeline.jl")
|
||||
|
||||
+123
-12
@@ -1,21 +1,34 @@
|
||||
function makeplural(s::Symbol)
|
||||
str = string(s)
|
||||
if last(str) != 's'
|
||||
return Symbol(string(s,"s"))
|
||||
end
|
||||
return s
|
||||
end
|
||||
|
||||
function make_non_underscore(s::Symbol)
|
||||
str = string(s)
|
||||
str = replace(str, "_" => "")
|
||||
return Symbol(str)
|
||||
end
|
||||
|
||||
const _keyAliases = Dict{Symbol,Symbol}()
|
||||
|
||||
function add_aliases(sym::Symbol, aliases::Symbol...)
|
||||
for alias in aliases
|
||||
if haskey(_keyAliases, alias)
|
||||
error("Already an alias $alias => $(_keyAliases[alias])... can't also alias $sym")
|
||||
if haskey(_keyAliases, alias) || alias === sym
|
||||
return nothing
|
||||
end
|
||||
_keyAliases[alias] = sym
|
||||
end
|
||||
return nothing
|
||||
end
|
||||
|
||||
function add_non_underscore_aliases!(aliases::Dict{Symbol,Symbol})
|
||||
for (k,v) in aliases
|
||||
s = string(k)
|
||||
if '_' in s
|
||||
aliases[Symbol(replace(s, "_" => ""))] = v
|
||||
aliases[make_non_underscore(k)] = v
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -24,7 +37,7 @@ function add_non_underscore_aliases!(aliases::Dict{Symbol,Symbol}, args::Vector{
|
||||
for arg in args
|
||||
s = string(arg)
|
||||
if '_' in s
|
||||
aliases[Symbol(replace(s, "_" => ""))] = arg
|
||||
aliases[make_non_underscore(arg)] = arg
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -111,6 +124,31 @@ const _styleAliases = Dict{Symbol,Symbol}(
|
||||
:ddd => :dashdotdot,
|
||||
)
|
||||
|
||||
const _shape_keys = Symbol[
|
||||
:circle,
|
||||
:rect,
|
||||
:star5,
|
||||
:diamond,
|
||||
:hexagon,
|
||||
:cross,
|
||||
:xcross,
|
||||
:utriangle,
|
||||
:dtriangle,
|
||||
:rtriangle,
|
||||
:ltriangle,
|
||||
:pentagon,
|
||||
:heptagon,
|
||||
:octagon,
|
||||
:star4,
|
||||
:star6,
|
||||
:star7,
|
||||
:star8,
|
||||
:vline,
|
||||
:hline,
|
||||
:+,
|
||||
:x,
|
||||
]
|
||||
|
||||
const _allMarkers = vcat(:none, :auto, _shape_keys) #sort(collect(keys(_shapes))))
|
||||
const _markerAliases = Dict{Symbol,Symbol}(
|
||||
:n => :none,
|
||||
@@ -287,7 +325,6 @@ const _series_defaults = KW(
|
||||
:hover => nothing, # text to display when hovering over the data points
|
||||
:stride => (1,1), # array stride for wireframe/surface, the first element is the row stride and the second is the column stride.
|
||||
:connections => nothing, # tuple of arrays to specifiy connectivity of a 3d mesh
|
||||
:series_projection => :none, # allows e.g. projection to planes in a 3D plot
|
||||
:extra_kwargs => Dict()
|
||||
)
|
||||
|
||||
@@ -492,7 +529,7 @@ const _all_series_args = sort(union([_series_args; _magic_series_args]))
|
||||
const _all_plot_args = _plot_args
|
||||
|
||||
const _all_args =
|
||||
sort([_all_axis_args; _all_subplot_args; _all_series_args; _all_plot_args])
|
||||
sort(union([_all_axis_args; _all_subplot_args; _all_series_args; _all_plot_args]))
|
||||
|
||||
is_subplot_attr(k) = k in _all_subplot_args
|
||||
is_series_attr(k) = k in _all_series_args
|
||||
@@ -503,9 +540,6 @@ RecipesBase.is_key_supported(k::Symbol) = is_attr_supported(k)
|
||||
is_default_attribute(k) = k in _internal_args || k in _all_args || is_axis_attr_noletter(k)
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
makeplural(s::Symbol) = Symbol(string(s,"s"))
|
||||
|
||||
autopick_ignore_none_auto(arr::AVec, idx::Integer) = _cycle(setdiff(arr, [:none, :auto]), idx)
|
||||
autopick_ignore_none_auto(notarr, idx::Integer) = notarr
|
||||
|
||||
@@ -647,10 +681,10 @@ add_aliases(:contour_labels, :contourlabels, :clabels, :clabs)
|
||||
add_aliases(:warn_on_unsupported, :warn)
|
||||
|
||||
# add all pluralized forms to the _keyAliases dict
|
||||
for arg in keys(_series_defaults)
|
||||
_keyAliases[makeplural(arg)] = arg
|
||||
for arg in _all_args
|
||||
add_aliases(arg, makeplural(arg))
|
||||
end
|
||||
|
||||
# add all non_underscored forms to the _keyAliases
|
||||
add_non_underscore_aliases!(_keyAliases)
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
@@ -1698,3 +1732,80 @@ function _series_index(plotattributes, sp)
|
||||
end
|
||||
return idx
|
||||
end
|
||||
|
||||
#--------------------------------------------------
|
||||
## inspired by Base.@kwdef
|
||||
macro add_attributes( level, expr )
|
||||
expr = macroexpand(__module__, expr) # to expand @static
|
||||
expr isa Expr && expr.head === :struct || error("Invalid usage of @add_attributes")
|
||||
T = expr.args[2]
|
||||
if T isa Expr && T.head === :<:
|
||||
T = T.args[1]
|
||||
end
|
||||
|
||||
key_args = Any[]
|
||||
value_args = Any[]
|
||||
|
||||
_splitdef!(expr.args[3], value_args, key_args)
|
||||
|
||||
insert_block = Expr(:block)
|
||||
for (key, value) in zip(key_args, value_args)
|
||||
# e.g. _series_defualts[key] = value
|
||||
exp_key = Symbol(lowercase(string(T)), "_", key)
|
||||
pl_key = makeplural(exp_key)
|
||||
push!(insert_block.args, Expr(
|
||||
:(=), Expr(:ref, Symbol("_", level, "_defaults"), QuoteNode(exp_key)), value
|
||||
))
|
||||
push!(insert_block.args, :(
|
||||
add_aliases($(QuoteNode(exp_key)), $(QuoteNode(pl_key)))
|
||||
))
|
||||
push!(insert_block.args, :(
|
||||
add_aliases($(QuoteNode(exp_key)), $(QuoteNode(make_non_underscore(exp_key))))
|
||||
))
|
||||
push!(insert_block.args, :(
|
||||
add_aliases($(QuoteNode(exp_key)), $(QuoteNode(make_non_underscore(pl_key))))
|
||||
))
|
||||
end
|
||||
return quote
|
||||
$expr
|
||||
$insert_block
|
||||
end |> esc
|
||||
end
|
||||
|
||||
function _splitdef!(blk, value_args, key_args)
|
||||
for i in eachindex(blk.args)
|
||||
ei = blk.args[i]
|
||||
if ei isa Symbol
|
||||
# var
|
||||
continue
|
||||
elseif ei isa Expr
|
||||
if ei.head === :(=)
|
||||
lhs = ei.args[1]
|
||||
if lhs isa Symbol
|
||||
# var = defexpr
|
||||
var = lhs
|
||||
elseif lhs isa Expr && lhs.head === :(::) && lhs.args[1] isa Symbol
|
||||
# var::T = defexpr
|
||||
var = lhs.args[1]
|
||||
else
|
||||
# something else, e.g. inline inner constructor
|
||||
# F(...) = ...
|
||||
continue
|
||||
end
|
||||
defexpr = ei.args[2] # defexpr
|
||||
push!(value_args, defexpr)
|
||||
push!(key_args, var)
|
||||
blk.args[i] = lhs
|
||||
elseif ei.head === :(::) && ei.args[1] isa Symbol
|
||||
# var::Typ
|
||||
var = ei.args[1]
|
||||
push!(value_args, var)
|
||||
push!(key_args, var)
|
||||
elseif ei.head === :block
|
||||
# can arise with use of @static inside type decl
|
||||
_kwdef!(ei, value_args, key_args)
|
||||
end
|
||||
end
|
||||
end
|
||||
blk
|
||||
end
|
||||
|
||||
@@ -818,7 +818,6 @@ const _pgfplotsx_seriestype = [
|
||||
:surface,
|
||||
:wireframe,
|
||||
:heatmap,
|
||||
:mesh3d,
|
||||
:contour,
|
||||
:contour3d,
|
||||
:quiver,
|
||||
|
||||
+1
-2
@@ -1451,8 +1451,7 @@ function gr_label_axis_3d(sp, letter)
|
||||
x_offset = -gr_axis_width(sp, ax)
|
||||
y_offset = 0
|
||||
end
|
||||
letter === :z && GR.setcharup(-1, 0)
|
||||
gr_text(x + x_offset, y + y_offset, ax[:guide])
|
||||
gr_text(x + x_offset, y - y_offset, ax[:guide])
|
||||
GR.restorestate()
|
||||
end
|
||||
end
|
||||
|
||||
@@ -202,7 +202,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend})
|
||||
for series in series_list(sp)
|
||||
if hascolorbar(series)
|
||||
cg = get_colorgradient(series)
|
||||
cm = pgfx_colormap(cg)
|
||||
cm = pgfx_colormap(get_colorgradient(series))
|
||||
PGFPlotsX.push_preamble!(
|
||||
pgfx_plot.the_plot,
|
||||
"""\\pgfplotsset{
|
||||
@@ -527,17 +527,6 @@ function pgfx_add_series!(::Val{:heatmap}, axis, series_opt, series, series_func
|
||||
pgfx_add_legend!(axis, series, opt)
|
||||
end
|
||||
|
||||
function pgfx_add_series!(::Val{:mesh3d}, axis, series_opt, series, series_func, opt)
|
||||
ptable = join([ string(i, " ", j, " ", k, "\\\\") for (i, j, k) in zip(opt[:connections]...) ], "\n ")
|
||||
push!(
|
||||
series_opt,
|
||||
"patch" => nothing,
|
||||
"table/row sep" => "\\\\",
|
||||
"patch table" => ptable
|
||||
)
|
||||
pgfx_add_series!(axis, series_opt, series, series_func, opt)
|
||||
end
|
||||
|
||||
function pgfx_add_series!(::Val{:contour}, axis, series_opt, series, series_func, opt)
|
||||
push!(axis.options, "view" => "{0}{90}")
|
||||
if isfilledcontour(series)
|
||||
@@ -564,34 +553,10 @@ function pgfx_add_series!(::Val{:filledcontour}, axis, series_opt, series, serie
|
||||
end
|
||||
|
||||
function pgfx_add_series!(::Val{:contour3d}, axis, series_opt, series, series_func, opt)
|
||||
isproj = opt[:series_projection] != :none
|
||||
if isproj
|
||||
proj_letter, lim_value = getproperty(
|
||||
(
|
||||
xy = (:z, zlims(opt[:subplot])[1]),
|
||||
yx = (:z, zlims(opt[:subplot])[2]),
|
||||
yz = (:x, xlims(opt[:subplot])[1]),
|
||||
zy = (:x, xlims(opt[:subplot])[2]),
|
||||
xz = (:y, ylims(opt[:subplot])[1]),
|
||||
zx = (:y, ylims(opt[:subplot])[2]),
|
||||
),
|
||||
get(opt, :series_projection, :xz),
|
||||
)
|
||||
push!(series_opt,
|
||||
"mesh" => nothing,
|
||||
"mesh/check" => false,
|
||||
"mesh/cols" => size(opt[:z], 1),
|
||||
"mesh/rows" => size(opt[:z], 2),
|
||||
"patch type" => "line",
|
||||
"point meta" => "rawz",
|
||||
"$proj_letter filter/.code" => "\\def\\pgfmathresult{$lim_value}"
|
||||
)
|
||||
else
|
||||
push!(
|
||||
series_opt,
|
||||
"contour prepared" => PGFPlotsX.Options("labels" => opt[:contour_labels]),
|
||||
)
|
||||
end
|
||||
push!(
|
||||
series_opt,
|
||||
"contour prepared" => PGFPlotsX.Options("labels" => opt[:contour_labels]),
|
||||
)
|
||||
args = pgfx_series_arguments(series, opt)
|
||||
series_plot = series_func(series_opt, PGFPlotsX.Table(Contour.contours(args..., opt[:levels])))
|
||||
push!(axis, series_plot)
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
|
||||
|
||||
const P2 = GeometryTypes.Point2{Float64}
|
||||
const P3 = GeometryTypes.Point3{Float64}
|
||||
|
||||
@@ -77,7 +75,6 @@ function weave(x,y; ordering = Vector[x,y])
|
||||
ret
|
||||
end
|
||||
|
||||
|
||||
"create a star by weaving together points from an outer and inner circle. `n` is the number of arms"
|
||||
function makestar(n; offset = -0.5, radius = 1.0)
|
||||
z1 = offset * π
|
||||
@@ -93,7 +90,6 @@ function makeshape(n; offset = -0.5, radius = 1.0)
|
||||
Shape(partialcircle(z, z + 2π, n+1, radius))
|
||||
end
|
||||
|
||||
|
||||
function makecross(; offset = -0.5, radius = 1.0)
|
||||
z2 = offset * π
|
||||
z1 = z2 - π/8
|
||||
@@ -103,7 +99,6 @@ function makecross(; offset = -0.5, radius = 1.0)
|
||||
ordering=Vector[outercircle,innercircle,outercircle]))
|
||||
end
|
||||
|
||||
|
||||
from_polar(angle, dist) = P2(dist*cos(angle), dist*sin(angle))
|
||||
|
||||
function makearrowhead(angle; h = 2.0, w = 0.4)
|
||||
@@ -112,31 +107,6 @@ function makearrowhead(angle; h = 2.0, w = 0.4)
|
||||
from_polar(angle + 0.5π, w) - tip, (0,0)])
|
||||
end
|
||||
|
||||
const _shape_keys = Symbol[
|
||||
:circle,
|
||||
:rect,
|
||||
:star5,
|
||||
:diamond,
|
||||
:hexagon,
|
||||
:cross,
|
||||
:xcross,
|
||||
:utriangle,
|
||||
:dtriangle,
|
||||
:rtriangle,
|
||||
:ltriangle,
|
||||
:pentagon,
|
||||
:heptagon,
|
||||
:octagon,
|
||||
:star4,
|
||||
:star6,
|
||||
:star7,
|
||||
:star8,
|
||||
:vline,
|
||||
:hline,
|
||||
:+,
|
||||
:x,
|
||||
]
|
||||
|
||||
const _shapes = KW(
|
||||
:circle => makeshape(20),
|
||||
:rect => makeshape(4, offset=-0.25),
|
||||
|
||||
+5
-21
@@ -1000,8 +1000,8 @@ const _examples = PlotExample[
|
||||
"Mesh3d",
|
||||
"""
|
||||
Allows to plot arbitrary 3d meshes. If only x,y,z are given the mesh is generated automatically.
|
||||
You can also specify the connections using the connections keyword.
|
||||
The connections are specified using a tuple of vectors. Each vector contains the 0-based indices of one point of a triangle,
|
||||
You can also specify the connections using the connections keyword. This is only supported on the Plotly backend.
|
||||
The connections are specified using a tuple of vectors. Each vector contains the 0-based indices of one point of a triangle,
|
||||
such that elements at the same position of these vectors form a triangle.
|
||||
""",
|
||||
[
|
||||
@@ -1048,25 +1048,6 @@ const _examples = PlotExample[
|
||||
heatmap(z, projection = :polar)
|
||||
end]
|
||||
),
|
||||
PlotExample( # 50
|
||||
"3D surface with axis guides",
|
||||
"",
|
||||
[quote
|
||||
f(x,a) = 1/x + a*x^2
|
||||
xs = collect(0.1:0.05:2.0);
|
||||
as = collect(0.2:0.1:2.0);
|
||||
|
||||
x_grid = [x for x in xs for y in as];
|
||||
a_grid = [y for x in xs for y in as];
|
||||
|
||||
plot(x_grid, a_grid, f.(x_grid,a_grid),
|
||||
st = :surface,
|
||||
xlabel = "longer xlabel",
|
||||
ylabel = "longer ylabel",
|
||||
zlabel = "longer zlabel",
|
||||
)
|
||||
end]
|
||||
),
|
||||
]
|
||||
|
||||
# Some constants for PlotDocs and PlotReferenceImages
|
||||
@@ -1076,13 +1057,16 @@ _backend_skips = Dict(
|
||||
:pyplot => [2, 25, 30, 31, 47, 49],
|
||||
:plotlyjs => [2, 21, 24, 25, 30, 31, 49],
|
||||
:plotly => [2, 21, 24, 25, 30, 31, 49],
|
||||
:pgfplots => [2, 5, 6, 10, 16, 20, 22, 23, 25, 28, 30, 31, 34, 37, 38, 39, 47],
|
||||
:pgfplotsx => [
|
||||
2, # animation
|
||||
6, # images
|
||||
16, # pgfplots thinks the upper panel is too small
|
||||
25, # @df
|
||||
30, # @df
|
||||
31, # animation
|
||||
32, # spy
|
||||
47, # mesh3
|
||||
49, # polar heatmap
|
||||
],
|
||||
)
|
||||
|
||||
+1
-1
@@ -1007,7 +1007,7 @@ export lens!
|
||||
# add subplot
|
||||
for series in sp.series_list
|
||||
@series begin
|
||||
plotattributes = merge(backup, copy(series.plotattributes))
|
||||
plotattributes = merge(plotattributes, copy(series.plotattributes))
|
||||
subplot := lens_index
|
||||
primary := false
|
||||
xlims := (x1, x2)
|
||||
|
||||
+1
-1
@@ -531,7 +531,7 @@ function get_colorgradient(series::Series)
|
||||
st = series[:seriestype]
|
||||
if st in (:surface, :heatmap) || isfilledcontour(series)
|
||||
series[:fillcolor]
|
||||
elseif st in (:contour, :wireframe, :contour3d)
|
||||
elseif st in (:contour, :wireframe)
|
||||
series[:linecolor]
|
||||
elseif series[:marker_z] !== nothing
|
||||
series[:markercolor]
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
using Plots, Test
|
||||
@testset "lens!" begin
|
||||
pl = plot(1:5)
|
||||
lens!(pl, [1,2], [1,2], inset = (1, bbox(0.0,0.0,0.2,0.2)), colorbar = false)
|
||||
lens!(pl, [1,2], [1,2], inset = (1, bbox(0.0,0.0,0.2,0.2)))
|
||||
@test length(pl.series_list) == 4
|
||||
@test pl[2][:colorbar] == :none
|
||||
end # testset
|
||||
|
||||
@testset "vline, vspan" begin
|
||||
|
||||
Reference in New Issue
Block a user