Compare commits

...

20 Commits

Author SHA1 Message Date
Daniel Schwabeneder f11b976574 Merge pull request #2128 from daschw/release
prepare release
2019-08-07 09:29:23 +02:00
Daniel Schwabeneder 59da5d5deb prepare release 2019-08-07 09:27:05 +02:00
Daniel Schwabeneder 0deb7038e6 Merge pull request #2124 from daschw/chars
handle chars
2019-08-07 09:19:53 +02:00
Daniel Schwabeneder 2ef692c690 Merge pull request #2125 from daschw/plotly-html
Fix saving to html and IJulia show for plotly (fix #1985)
2019-08-07 09:11:36 +02:00
Daniel Schwabeneder 9228c0b9ec improve plotly html formatting 2019-08-06 16:08:49 +02:00
Daniel Schwabeneder 89d02b1d67 allow plotly plotting in ijulia 2019-08-06 15:02:04 +02:00
Daniel Schwabeneder a63a9248d6 handle chars 2019-08-06 14:05:35 +02:00
Jack Devine 79777adc07 Merge pull request #2122 from JackDevine/expand_path
Expand paths beginning with ~ on unix systems.
2019-08-06 21:30:49 +12:00
JackDevine 5619feb6c0 Expand paths beginning with ~ on unix systems. 2019-08-06 20:40:09 +12:00
Daniel Schwabeneder f15a721db6 Merge pull request #2119 from daschw/palette
don't split color_palette into groups (fix #2104)
2019-08-02 15:50:57 +02:00
Daniel Schwabeneder d6b3b68cd9 don't split color_palette into groups 2019-08-02 14:54:32 +02:00
Yuval 78785fa8fe Merge pull request #2110 from yha/convertToAny
convertToAnyVector cleanup. Adds missing support in heatmap/volume.
2019-07-31 00:33:39 +03:00
yha 74c69f575f Fix general vec method 2019-07-25 18:51:04 +03:00
yha 12e34bb24f Fix comment, move all3D method 2019-07-25 18:29:49 +03:00
yha 4ac5484b4f convertToAnyVector cleanup. Adds missing support in heatmap/volume. 2019-07-25 18:08:37 +03:00
Daniel Schwabeneder 8306619faf Merge pull request #2109 from yha/datetime-fix
Restore Date, DateTime and Time recipes
2019-07-25 15:49:14 +02:00
yha 5673477428 Restore Date, DateTime and Time recipes 2019-07-25 16:05:08 +03:00
Daniel Schwabeneder 84c5b67574 Merge pull request #2035 from wfrgra/date_period_recipes
add recipes for time periods
2019-07-18 11:37:15 +02:00
Will Grant 068523fac1 neaten change by implementing with a for loop 2019-06-17 17:44:24 +10:00
Will Grant 6d6d4f14b5 add recipes for time periods 2019-05-24 11:27:09 +10:00
8 changed files with 52 additions and 69 deletions
+7
View File
@@ -11,6 +11,13 @@
---
## (current master)
## 0.26.1
- handle `Char`s as input data
- fix html saving for Plotly
- expand ~ in paths on UNIX systems
- convertToAnyVector clean-up
- fix color_palette grouping issue
## 0.26.0
- use FFMPEG.jl
- add missing method for convertToAnyVector
+1 -1
View File
@@ -1,7 +1,7 @@
name = "Plots"
uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
author = ["Tom Breloff (@tbreloff)"]
version = "0.26.0"
version = "0.26.1"
[deps]
Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
+1 -1
View File
@@ -1,6 +1,6 @@
module Plots
_current_plots_version = v"0.25.0"
_current_plots_version = v"0.26.1"
using Reexport
+1 -1
View File
@@ -70,7 +70,7 @@ function buildanimation(animdir::AbstractString, fn::AbstractString,
fps::Integer = 20, loop::Integer = 0,
variable_palette::Bool=false,
show_msg::Bool=true)
fn = abspath(fn)
fn = abspath(expanduser(fn))
if is_animated_gif
if variable_palette
+7 -4
View File
@@ -347,7 +347,7 @@ function plotly_layout(plt::Plot)
end
function plotly_layout_json(plt::Plot)
JSON.json(plotly_layout(plt))
JSON.json(plotly_layout(plt), 4)
end
@@ -800,7 +800,7 @@ function plotly_series(plt::Plot)
end
# get json string for a list of dictionaries, each representing the series params
plotly_series_json(plt::Plot) = JSON.json(plotly_series(plt))
plotly_series_json(plt::Plot) = JSON.json(plotly_series(plt), 4)
# ----------------------------------------------------------------
@@ -822,8 +822,6 @@ function html_head(plt::Plot{PlotlyBackend})
""")
ijulia_initialized[] = true
end
# IJulia just needs one initialization
isijulia() && return ""
return "<script src=$(repr(plotly))></script>"
end
@@ -863,6 +861,11 @@ function _show(io::IO, ::MIME"application/vnd.plotly.v1+json", plot::Plot{Plotly
end
function _show(io::IO, ::MIME"text/html", plt::Plot{PlotlyBackend})
write(io, standalone_html(plt))
end
function _display(plt::Plot{PlotlyBackend})
standalone_html_window(plt)
end
+1 -1
View File
@@ -103,7 +103,7 @@ type is inferred from the file extension. All backends support png and pdf
file types, some also support svg, ps, eps, html and tex.
"""
function savefig(plt::Plot, fn::AbstractString)
fn = abspath(expanduser(fn))
# get the extension
local ext
try
+1
View File
@@ -1099,6 +1099,7 @@ timeformatter(t) = string(Dates.Time(Dates.Nanosecond(t)))
@recipe f(::Type{Date}, dt::Date) = (dt -> Dates.value(dt), dateformatter)
@recipe f(::Type{DateTime}, dt::DateTime) = (dt -> Dates.value(dt), datetimeformatter)
@recipe f(::Type{Dates.Time}, t::Dates.Time) = (t -> Dates.value(t), timeformatter)
@recipe f(::Type{P}, t::P) where P <: Dates.Period = (t -> Dates.value(t), t -> string(P(t)))
# -------------------------------------------------
# Complex Numbers
+33 -61
View File
@@ -7,67 +7,36 @@
# note: returns meta information... mainly for use with automatic labeling from DataFrames for now
const FuncOrFuncs{F} = Union{F, Vector{F}, Matrix{F}}
const DataPoint = Union{Number, AbstractString, AbstractChar, Missing}
const SeriesData = Union{AVec{<:DataPoint}, Function, Surface, Volume}
all3D(plotattributes::KW) = trueOrAllTrue(st -> st in (:contour, :contourf, :heatmap, :surface, :wireframe, :contour3d, :image, :plots_heatmap), get(plotattributes, :seriestype, :none))
# unknown
convertToAnyVector(x, plotattributes::KW) = error("No user recipe defined for $(typeof(x))")
# missing
convertToAnyVector(v::Nothing, plotattributes::KW) = Any[nothing], nothing
# fixed number of blank series
convertToAnyVector(n::Integer, plotattributes::KW) = Any[zeros(0) for i in 1:n], nothing
# numeric/string vector
convertToAnyVector(v::AVec{T}, plotattributes::KW) where {T<:Union{Number,AbstractString,Missing}} = Any[handlemissings(v)], nothing
function convertToAnyVector(v::AMat, plotattributes::KW)
v = handlemissings(v)
if all3D(plotattributes)
Any[Surface(v)]
else
Any[v[:,i] for i in 1:size(v,2)]
end, nothing
end
prepareSeriesData(x) = error("Cannot convert $(typeof(x)) to series data for plotting")
prepareSeriesData(::Nothing) = nothing
prepareSeriesData(s::SeriesData) = handlemissings(handlechars(s))
handlemissings(v) = v
handlemissings(v::AbstractArray{Union{T,Missing}}) where T <: Number = replace(v, missing => NaN)
handlemissings(v::AbstractArray{Union{T,Missing}}) where T <: AbstractString = replace(v, missing => "")
handlemissings(s::Surface) = Surface(handlemissings(s.surf))
handlemissings(v::Volume) = Volume(handlemissings(v.v), v.x_extents, v.y_extents, v.z_extents)
# function
convertToAnyVector(f::Function, plotattributes::KW) = Any[f], nothing
handlechars(x) = x
handlechars(c::AVec{<:AbstractChar}) = string.(c)
# surface
convertToAnyVector(s::Surface, plotattributes::KW) = Any[s], nothing
# default: assume x represents a single series
convertToAnyVector(x) = Any[prepareSeriesData(x)]
# volume
convertToAnyVector(v::Volume, plotattributes::KW) = Any[v], nothing
# fixed number of blank series
convertToAnyVector(n::Integer) = Any[zeros(0) for i in 1:n]
# # vector of OHLC
# convertToAnyVector(v::AVec{OHLC}, plotattributes::KW) = Any[v], nothing
# # dates
convertToAnyVector(dts::AVec{D}, plotattributes::KW) where {D<:Union{Date,DateTime}} = Any[dts], nothing
# vector of data points is a single series
convertToAnyVector(v::AVec{<:DataPoint}) = Any[prepareSeriesData(v)]
# list of things (maybe other vectors, functions, or something else)
function convertToAnyVector(v::AVec, plotattributes::KW)
if all(x -> typeof(x) <: Number, v)
# all real numbers wrap the whole vector as one item
Any[convert(Vector{Float64}, v)], nothing
else
# something else... treat each element as an item
vcat(Any[convertToAnyVector(vi, plotattributes)[1] for vi in v]...), nothing
# Any[vi for vi in v], nothing
end
end
convertToAnyVector(v::AVec) = vcat((convertToAnyVector(vi) for vi in v)...)
convertToAnyVector(t::Tuple, plotattributes::KW) = Any[t], nothing
function convertToAnyVector(args...)
error("In convertToAnyVector, could not handle the argument types: $(map(typeof, args[1:end-1]))")
end
# Matrix is split into columns
convertToAnyVector(v::AMat{<:DataPoint}) = Any[prepareSeriesData(v[:,i]) for i in 1:size(v,2)]
# --------------------------------------------------------------------
@@ -130,23 +99,24 @@ struct SliceIt end
z = z.data
end
xs, _ = convertToAnyVector(x, plotattributes)
ys, _ = convertToAnyVector(y, plotattributes)
zs, _ = convertToAnyVector(z, plotattributes)
xs = convertToAnyVector(x)
ys = convertToAnyVector(y)
zs = convertToAnyVector(z)
fr = pop!(plotattributes, :fillrange, nothing)
fillranges, _ = if typeof(fr) <: Number
([fr],nothing)
fillranges = if typeof(fr) <: Number
[fr]
else
convertToAnyVector(fr, plotattributes)
convertToAnyVector(fr)
end
mf = length(fillranges)
rib = pop!(plotattributes, :ribbon, nothing)
ribbons, _ = if typeof(rib) <: Number
([fr],nothing)
ribbons = if typeof(rib) <: Number
[rib]
else
convertToAnyVector(rib, plotattributes)
convertToAnyVector(rib)
end
mr = length(ribbons)
@@ -288,8 +258,10 @@ end
@recipe f(n::Integer) = is3d(get(plotattributes,:seriestype,:path)) ? (SliceIt, n, n, n) : (SliceIt, n, n, nothing)
all3D(plotattributes::KW) = trueOrAllTrue(st -> st in (:contour, :contourf, :heatmap, :surface, :wireframe, :contour3d, :image, :plots_heatmap), get(plotattributes, :seriestype, :none))
# return a surface if this is a 3d plot, otherwise let it be sliced up
@recipe function f(mat::AMat{T}) where T<:Union{Integer,AbstractFloat}
@recipe function f(mat::AMat{T}) where T<:Union{Integer,AbstractFloat,Missing}
if all3D(plotattributes)
n,m = size(mat)
wrap_surfaces(plotattributes)
@@ -312,7 +284,7 @@ end
end
# assume this is a Volume, so construct one
@recipe function f(vol::AbstractArray{T,3}, args...) where T<:Number
@recipe function f(vol::AbstractArray{T,3}, args...) where T<:Union{Number,Missing}
seriestype := :volume
SliceIt, nothing, Volume(vol, args...), nothing
end
@@ -581,7 +553,7 @@ end
# end
splittable_kw(key, val, lengthGroup) = false
splittable_kw(key, val::AbstractArray, lengthGroup) = (key != :group) && size(val,1) == lengthGroup
splittable_kw(key, val::AbstractArray, lengthGroup) = !(key in (:group, :color_palette)) && size(val,1) == lengthGroup
splittable_kw(key, val::Tuple, lengthGroup) = all(splittable_kw.(key, val, lengthGroup))
splittable_kw(key, val::SeriesAnnotations, lengthGroup) = splittable_kw(key, val.strs, lengthGroup)