commit
1784d6179a
12
src/Plots.jl
12
src/Plots.jl
@ -10,7 +10,7 @@ using Reexport
|
|||||||
|
|
||||||
import GeometryTypes, GeometryBasics
|
import GeometryTypes, GeometryBasics
|
||||||
using Dates, Printf, Statistics, Base64, LinearAlgebra, Random
|
using Dates, Printf, Statistics, Base64, LinearAlgebra, Random
|
||||||
import SparseArrays: AbstractSparseMatrix, findnz
|
using SparseArrays
|
||||||
|
|
||||||
using FFMPEG
|
using FFMPEG
|
||||||
|
|
||||||
@ -154,6 +154,12 @@ const BBox = Measures.Absolute2DBox
|
|||||||
# allow pixels and percentages
|
# allow pixels and percentages
|
||||||
const px = AbsoluteLength(0.254)
|
const px = AbsoluteLength(0.254)
|
||||||
const pct = Length{:pct, Float64}(1.0)
|
const pct = Length{:pct, Float64}(1.0)
|
||||||
|
|
||||||
|
Base.:*(m1::AbsoluteLength, m2::Length{:pct}) = AbsoluteLength(m1.value * m2.value)
|
||||||
|
Base.:*(m1::Length{:pct}, m2::AbsoluteLength) = AbsoluteLength(m2.value * m1.value)
|
||||||
|
Base.:/(m1::AbsoluteLength, m2::Length{:pct}) = AbsoluteLength(m1.value / m2.value)
|
||||||
|
Base.:/(m1::Length{:pct}, m2::AbsoluteLength) = AbsoluteLength(m2.value / m1.value)
|
||||||
|
|
||||||
export BBox, BoundingBox, mm, cm, inch, px, pct, pt, w, h
|
export BBox, BoundingBox, mm, cm, inch, px, pct, pt, w, h
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -218,8 +224,8 @@ let PlotOrSubplot = Union{Plot, Subplot}
|
|||||||
global xlims!(plt::PlotOrSubplot, xmin::Real, xmax::Real; kw...) = plot!(plt; xlims = (xmin,xmax), kw...)
|
global xlims!(plt::PlotOrSubplot, xmin::Real, xmax::Real; kw...) = plot!(plt; xlims = (xmin,xmax), kw...)
|
||||||
global ylims!(plt::PlotOrSubplot, ymin::Real, ymax::Real; kw...) = plot!(plt; ylims = (ymin,ymax), kw...)
|
global ylims!(plt::PlotOrSubplot, ymin::Real, ymax::Real; kw...) = plot!(plt; ylims = (ymin,ymax), kw...)
|
||||||
global zlims!(plt::PlotOrSubplot, zmin::Real, zmax::Real; kw...) = plot!(plt; zlims = (zmin,zmax), kw...)
|
global zlims!(plt::PlotOrSubplot, zmin::Real, zmax::Real; kw...) = plot!(plt; zlims = (zmin,zmax), kw...)
|
||||||
global xticks!(plt::PlotOrSubplot, ticks::TicksArgs; kw...) where {T<:Real} = plot!(plt; xticks = ticks, kw...)
|
global xticks!(plt::PlotOrSubplot, ticks::TicksArgs; kw...) = plot!(plt; xticks = ticks, kw...)
|
||||||
global yticks!(plt::PlotOrSubplot, ticks::TicksArgs; kw...) where {T<:Real} = plot!(plt; yticks = ticks, kw...)
|
global yticks!(plt::PlotOrSubplot, ticks::TicksArgs; kw...) = plot!(plt; yticks = ticks, kw...)
|
||||||
global xticks!(plt::PlotOrSubplot,
|
global xticks!(plt::PlotOrSubplot,
|
||||||
ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} = plot!(plt; xticks = (ticks,labels), kw...)
|
ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} = plot!(plt; xticks = (ticks,labels), kw...)
|
||||||
global yticks!(plt::PlotOrSubplot,
|
global yticks!(plt::PlotOrSubplot,
|
||||||
|
|||||||
@ -596,7 +596,7 @@ function plotly_series(plt::Plot, series::Series)
|
|||||||
plotattributes_out[:type] = "mesh3d"
|
plotattributes_out[:type] = "mesh3d"
|
||||||
plotattributes_out[:x], plotattributes_out[:y], plotattributes_out[:z] = x, y, z
|
plotattributes_out[:x], plotattributes_out[:y], plotattributes_out[:z] = x, y, z
|
||||||
|
|
||||||
if series[:connections] != nothing
|
if series[:connections] !== nothing
|
||||||
if typeof(series[:connections]) <: Tuple{Array,Array,Array}
|
if typeof(series[:connections]) <: Tuple{Array,Array,Array}
|
||||||
i,j,k = series[:connections]
|
i,j,k = series[:connections]
|
||||||
if !(length(i) == length(j) == length(k))
|
if !(length(i) == length(j) == length(k))
|
||||||
|
|||||||
@ -80,7 +80,7 @@ function __init__()
|
|||||||
artifact_toml = joinpath(@__DIR__, "Artifacts.toml")
|
artifact_toml = joinpath(@__DIR__, "Artifacts.toml")
|
||||||
|
|
||||||
plotly_sha = artifact_hash("plotly", artifact_toml)
|
plotly_sha = artifact_hash("plotly", artifact_toml)
|
||||||
if plotly_sha == nothing || !artifact_exists(plotly_sha)
|
if plotly_sha === nothing || !artifact_exists(plotly_sha)
|
||||||
plotly_sha = create_artifact() do artifact_dir
|
plotly_sha = create_artifact() do artifact_dir
|
||||||
download("https://cdn.plot.ly/plotly-1.54.2.min.js", joinpath(artifact_dir, "plotly-1.54.2.min.js"))
|
download("https://cdn.plot.ly/plotly-1.54.2.min.js", joinpath(artifact_dir, "plotly-1.54.2.min.js"))
|
||||||
end
|
end
|
||||||
|
|||||||
@ -4,34 +4,6 @@
|
|||||||
to_pixels(m::AbsoluteLength) = m.value / 0.254
|
to_pixels(m::AbsoluteLength) = m.value / 0.254
|
||||||
|
|
||||||
const _cbar_width = 5mm
|
const _cbar_width = 5mm
|
||||||
|
|
||||||
#Base.broadcast(::typeof(Base.:.*), m::Measure, n::Number) = m * n
|
|
||||||
#Base.broadcast(::typeof(Base.:.*), m::Number, n::Measure) = m * n
|
|
||||||
Base.:-(m::Measure, a::AbstractArray) = map(ai -> m - ai, a)
|
|
||||||
Base.:-(a::AbstractArray, m::Measure) = map(ai -> ai - m, a)
|
|
||||||
Base.zero(::Type{typeof(mm)}) = 0mm
|
|
||||||
Base.one(::Type{typeof(mm)}) = 1mm
|
|
||||||
Base.typemin(::typeof(mm)) = -Inf*mm
|
|
||||||
Base.typemax(::typeof(mm)) = Inf*mm
|
|
||||||
Base.convert(::Type{F}, l::AbsoluteLength) where {F<:AbstractFloat} = convert(F, l.value)
|
|
||||||
|
|
||||||
# TODO: these are unintuitive and may cause tricky bugs
|
|
||||||
# Base.:+(m1::AbsoluteLength, m2::Length{:pct}) = AbsoluteLength(m1.value * (1 + m2.value))
|
|
||||||
# Base.:+(m1::Length{:pct}, m2::AbsoluteLength) = AbsoluteLength(m2.value * (1 + m1.value))
|
|
||||||
# Base.:-(m1::AbsoluteLength, m2::Length{:pct}) = AbsoluteLength(m1.value * (1 - m2.value))
|
|
||||||
# Base.:-(m1::Length{:pct}, m2::AbsoluteLength) = AbsoluteLength(m2.value * (m1.value - 1))
|
|
||||||
|
|
||||||
Base.:*(m1::AbsoluteLength, m2::Length{:pct}) = AbsoluteLength(m1.value * m2.value)
|
|
||||||
Base.:*(m1::Length{:pct}, m2::AbsoluteLength) = AbsoluteLength(m2.value * m1.value)
|
|
||||||
Base.:/(m1::AbsoluteLength, m2::Length{:pct}) = AbsoluteLength(m1.value / m2.value)
|
|
||||||
Base.:/(m1::Length{:pct}, m2::AbsoluteLength) = AbsoluteLength(m2.value / m1.value)
|
|
||||||
|
|
||||||
|
|
||||||
Base.zero(::Type{typeof(pct)}) = 0pct
|
|
||||||
Base.one(::Type{typeof(pct)}) = 1pct
|
|
||||||
Base.typemin(::typeof(pct)) = 0pct
|
|
||||||
Base.typemax(::typeof(pct)) = 1pct
|
|
||||||
|
|
||||||
const defaultbox = BoundingBox(0mm, 0mm, 0mm, 0mm)
|
const defaultbox = BoundingBox(0mm, 0mm, 0mm, 0mm)
|
||||||
|
|
||||||
left(bbox::BoundingBox) = bbox.x0[1]
|
left(bbox::BoundingBox) = bbox.x0[1]
|
||||||
|
|||||||
@ -49,7 +49,7 @@ RecipesPipeline.splittable_attribute(plt::Plot, key, val::SeriesAnnotations, len
|
|||||||
RecipesPipeline.splittable_attribute(plt, key, val.strs, len)
|
RecipesPipeline.splittable_attribute(plt, key, val.strs, len)
|
||||||
|
|
||||||
function RecipesPipeline.split_attribute(plt::Plot, key, val::SeriesAnnotations, indices)
|
function RecipesPipeline.split_attribute(plt::Plot, key, val::SeriesAnnotations, indices)
|
||||||
split_strs = RecipesPipeline.split_attribute(key, val.strs, indices)
|
split_strs = RecipesPipeline.split_attribute(plt, key, val.strs, indices)
|
||||||
return SeriesAnnotations(split_strs, val.font, val.baseshape, val.scalefactor)
|
return SeriesAnnotations(split_strs, val.font, val.baseshape, val.scalefactor)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -280,7 +280,7 @@ end
|
|||||||
end
|
end
|
||||||
fillrange := nothing
|
fillrange := nothing
|
||||||
seriestype := :path
|
seriestype := :path
|
||||||
if plotattributes[:linecolor] == :auto && plotattributes[:marker_z] !== nothing && plotattributes[:line_z] == nothing
|
if plotattributes[:linecolor] == :auto && plotattributes[:marker_z] !== nothing && plotattributes[:line_z] === nothing
|
||||||
line_z := plotattributes[:marker_z]
|
line_z := plotattributes[:marker_z]
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -933,7 +933,7 @@ end
|
|||||||
@recipe function f(::Type{Val{:mesh3d}}, x, y, z)
|
@recipe function f(::Type{Val{:mesh3d}}, x, y, z)
|
||||||
# As long as no i,j,k are supplied this should work with PyPlot and GR
|
# As long as no i,j,k are supplied this should work with PyPlot and GR
|
||||||
seriestype := :surface
|
seriestype := :surface
|
||||||
if plotattributes[:connections] != nothing
|
if plotattributes[:connections] !== nothing
|
||||||
throw(ArgumentError("Giving triangles using the connections argument is only supported on Plotly backend."))
|
throw(ArgumentError("Giving triangles using the connections argument is only supported on Plotly backend."))
|
||||||
end
|
end
|
||||||
()
|
()
|
||||||
@ -1496,7 +1496,7 @@ end
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
Plots.findnz(A::AbstractSparseMatrix) = findnz(A)
|
Plots.findnz(A::AbstractSparseMatrix) = SparseArrays.findnz(A)
|
||||||
|
|
||||||
# fallback function for finding non-zero elements of non-sparse matrices
|
# fallback function for finding non-zero elements of non-sparse matrices
|
||||||
function Plots.findnz(A::AbstractMatrix)
|
function Plots.findnz(A::AbstractMatrix)
|
||||||
|
|||||||
@ -432,10 +432,10 @@ zlims!(zmin::Real, zmax::Real; kw...) = plot!(; zlims = (zmi
|
|||||||
|
|
||||||
|
|
||||||
"Set xticks for an existing plot"
|
"Set xticks for an existing plot"
|
||||||
xticks!(v::TicksArgs; kw...) where {T<:Real} = plot!(; xticks = v, kw...)
|
xticks!(v::TicksArgs; kw...) = plot!(; xticks = v, kw...)
|
||||||
|
|
||||||
"Set yticks for an existing plot"
|
"Set yticks for an existing plot"
|
||||||
yticks!(v::TicksArgs; kw...) where {T<:Real} = plot!(; yticks = v, kw...)
|
yticks!(v::TicksArgs; kw...) = plot!(; yticks = v, kw...)
|
||||||
|
|
||||||
xticks!(
|
xticks!(
|
||||||
ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} = plot!(; xticks = (ticks,labels), kw...)
|
ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} = plot!(; xticks = (ticks,labels), kw...)
|
||||||
|
|||||||
10
src/utils.jl
10
src/utils.jl
@ -207,9 +207,6 @@ end
|
|||||||
|
|
||||||
createSegments(z) = collect(repeat(reshape(z,1,:),2,1))[2:end]
|
createSegments(z) = collect(repeat(reshape(z,1,:),2,1))[2:end]
|
||||||
|
|
||||||
Base.first(c::Colorant) = c
|
|
||||||
Base.first(x::Symbol) = x
|
|
||||||
|
|
||||||
|
|
||||||
sortedkeys(plotattributes::Dict) = sort(collect(keys(plotattributes)))
|
sortedkeys(plotattributes::Dict) = sort(collect(keys(plotattributes)))
|
||||||
|
|
||||||
@ -295,13 +292,6 @@ limsType(lims::Tuple{T,S}) where {T<:Real,S<:Real} = :limits
|
|||||||
limsType(lims::Symbol) = lims == :auto ? :auto : :invalid
|
limsType(lims::Symbol) = lims == :auto ? :auto : :invalid
|
||||||
limsType(lims) = :invalid
|
limsType(lims) = :invalid
|
||||||
|
|
||||||
# axis_Symbol(letter, postfix) = Symbol(letter * postfix)
|
|
||||||
# axis_symbols(letter, postfix...) = map(s -> axis_Symbol(letter, s), postfix)
|
|
||||||
|
|
||||||
Base.convert(::Type{Vector{T}}, rng::AbstractRange{T}) where {T<:Real} = T[x for x in rng]
|
|
||||||
Base.convert(::Type{Vector{T}}, rng::AbstractRange{S}) where {T<:Real,S<:Real} = T[x for x in rng]
|
|
||||||
|
|
||||||
Base.merge(a::AbstractVector, b::AbstractVector) = sort(unique(vcat(a,b)))
|
|
||||||
|
|
||||||
# recursively merge kw-dicts, e.g. for merging extra_kwargs / extra_plot_kwargs in plotly)
|
# recursively merge kw-dicts, e.g. for merging extra_kwargs / extra_plot_kwargs in plotly)
|
||||||
recursive_merge(x::AbstractDict...) = merge(recursive_merge, x...)
|
recursive_merge(x::AbstractDict...) = merge(recursive_merge, x...)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user