Compare commits

...

14 Commits

Author SHA1 Message Date
Daniel Schwabeneder 64e035c53c Merge pull request #2090 from daschw/areaplot
add areaplot recipe (close #1423)
2019-07-04 13:45:52 +02:00
Daniel Schwabeneder adbe515af7 up version 2019-07-04 12:55:02 +02:00
Daniel Schwabeneder f0dac1630f fewer lines 2019-07-04 12:53:01 +02:00
Daniel Schwabeneder ddaa69bce2 move areaplot doc from shorthands to recipes 2019-07-04 12:48:47 +02:00
Daniel Schwabeneder bb7c2fd660 Merge pull request #2089 from daschw/zcolor-missing
allow missing in line_z, fill_z and marker_z (fix #2083)
2019-07-04 11:36:08 +02:00
Daniel Schwabeneder 8dfca61769 add areaplot recipe 2019-07-04 11:31:00 +02:00
Daniel Schwabeneder bb3c54cb27 allow missing in line_z, fill_z and marker_z 2019-07-04 10:39:31 +02:00
Daniel Schwabeneder 2816b1128f Merge pull request #2081 from oschulz/loghist-zerobins-fix
Fix representation of zero-valued bins on step-histograms with log-y axis
2019-07-02 08:01:50 +02:00
Daniel Schwabeneder cf0cf972e3 Merge pull request #2080 from daschw/gr-linealpha
fix gr linealpha (fix #2078)
2019-07-02 08:01:23 +02:00
Daniel Schwabeneder bb0e783c02 Merge pull request #2082 from yha/point-recipe-fix
Support arbitrary element type (esp. missing) in tuple/Point recipes
2019-07-01 22:02:52 +02:00
yha a7b7c5ba81 Support any element type (incl. missing) and length in tuple/Point recipes 2019-07-01 01:39:05 +03:00
Oliver Schulz 7214b8b1b1 Improve type stability of _stepbins_path 2019-06-30 17:42:25 +02:00
Oliver Schulz db1e25252a Fix zero and NaN weighted bins in stephist for log-yscale
Bins with weight NaN and zero (which the Plots engine seems to
turn into into NaN automatically for log-yscale) should
not be draws in log-yscale.
2019-06-30 17:42:25 +02:00
Daniel Schwabeneder 7a248331e7 fix gr linealpha 2019-06-30 13:15:04 +02:00
7 changed files with 131 additions and 113 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
name = "Plots"
uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
author = ["Tom Breloff (@tbreloff)"]
version = "0.25.2"
version = "0.25.3"
[deps]
Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
+1 -1
View File
@@ -1280,10 +1280,10 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas)
for (i, rng) in enumerate(segments)
lc = get_linecolor(series, clims, i)
gr_set_line(get_linewidth(series, i), get_linestyle(series, i), lc) #, series[:linealpha])
gr_set_transparency(lc, get_linealpha(series, i))
arrowside = isa(series[:arrow], Arrow) ? series[:arrow].side : :none
arrowstyle = isa(series[:arrow], Arrow) ? series[:arrow].style : :simple
gr_set_fillcolor(lc)
gr_set_transparency(lc, get_linealpha(series, i))
gr_polyline(x[rng], y[rng]; arrowside = arrowside, arrowstyle = arrowstyle)
end
end
+29 -3
View File
@@ -538,13 +538,15 @@ function _stepbins_path(edge, weights, baseline::Real, xscale::Symbol, yscale::S
w, it_state_w = it_tuple_w
if (log_scale_x && a 0)
a = b/_logScaleBases[xscale]^3
a = oftype(a, b/_logScaleBases[xscale]^3)
end
if isnan(w)
if !isnan(last_w)
push!(x, a)
push!(y, baseline)
push!(x, NaN)
push!(y, NaN)
end
else
if isnan(last_w)
@@ -557,8 +559,8 @@ function _stepbins_path(edge, weights, baseline::Real, xscale::Symbol, yscale::S
push!(y, w)
end
a = b
last_w = w
a = oftype(a, b)
last_w = oftype(last_w, w)
it_tuple_e = iterate(edge, it_state_e)
it_tuple_w = iterate(weights, it_state_w)
@@ -1181,3 +1183,27 @@ end
@series Plots.isvertical(plotattributes) ? (sx, sy) : (sy, sx)
end
end
"""
areaplot([x,] y)
areaplot!([x,] y)
Draw a stacked area plot of the matrix y.
# Examples
```julia-repl
julia> areaplot(1:3, [1 2 3; 7 8 9; 4 5 6], seriescolor = [:red :green :blue], fillalpha = [0.2 0.3 0.4])
```
"""
@userplot AreaPlot
@recipe function f(a::AreaPlot)
data = cumsum(a.args[end], dims=2)
x = length(a.args) == 1 ? (1:size(data, 1)) : a.args[1]
seriestype := :line
for i in 1:size(data, 2)
@series begin
fillrange := i > 1 ? data[:,i-1] : 0
x, data[:,i]
end
end
end
+6 -25
View File
@@ -553,33 +553,14 @@ end
# # Lists of tuples and GeometryTypes.Points
# # --------------------------------------------------------------------
#
# # if we get an unhandled tuple, just splat it in
@recipe f(tup::Tuple) = tup
#
# # (x,y) tuples
@recipe f(xy::AVec{Tuple{R1,R2}}) where {R1<:Number,R2<:Number} = unzip(xy)
@recipe f(xy::Tuple{R1,R2}) where {R1<:Number,R2<:Number} = [xy[1]], [xy[2]]
@recipe f(v::AVec{<:Tuple}) = unzip(v)
@recipe f(v::AVec{<:GeometryTypes.Point}) = unzip(v)
@recipe f(tup::Tuple) = [tup]
@recipe f(p::GeometryTypes.Point) = [p]
#
# # (x,y,z) tuples
@recipe f(xyz::AVec{Tuple{R1,R2,R3}}) where {R1<:Number,R2<:Number,R3<:Number} = unzip(xyz)
@recipe f(xyz::Tuple{R1,R2,R3}) where {R1<:Number,R2<:Number,R3<:Number} = [xyz[1]], [xyz[2]], [xyz[3]]
# these might be points+velocity, or OHLC or something else
@recipe f(xyuv::AVec{Tuple{R1,R2,R3,R4}}) where {R1<:Number,R2<:Number,R3<:Number,R4<:Number} = get(plotattributes,:seriestype,:path)==:ohlc ? OHLC[OHLC(t...) for t in xyuv] : unzip(xyuv)
@recipe f(xyuv::Tuple{R1,R2,R3,R4}) where {R1<:Number,R2<:Number,R3<:Number,R4<:Number} = [xyuv[1]], [xyuv[2]], [xyuv[3]], [xyuv[4]]
#
# # 2D Points
@recipe f(xy::AVec{GeometryTypes.Point{2,T}}) where {T<:Number} = unzip(xy)
@recipe f(xy::GeometryTypes.Point{2,T}) where {T<:Number} = [xy[1]], [xy[2]]
#
# # 3D Points
@recipe f(xyz::AVec{GeometryTypes.Point{3,T}}) where {T<:Number} = unzip(xyz)
@recipe f(xyz::GeometryTypes.Point{3,T}) where {T<:Number} = [xyz[1]], [xyz[2]], [xyz[3]]
# Special case for 4-tuples in :ohlc series
@recipe f(xyuv::AVec{<:Tuple{R1,R2,R3,R4}}) where {R1,R2,R3,R4} = get(plotattributes,:seriestype,:path)==:ohlc ? OHLC[OHLC(t...) for t in xyuv] : unzip(xyuv)
#
# # --------------------------------------------------------------------
+69 -69
View File
@@ -2,10 +2,10 @@
scatter(x,y)
scatter!(x,y)
Make a scatter plot of y vs x.
Make a scatter plot of y vs x.
# Examples
```julia-repl
```julia-repl
julia> scatter([1,2,3],[4,5,6],markersize=[3,4,5],markercolor=[:red,:green,:blue])
julia> scatter([(1,4),(2,5),(3,6)])
```
@@ -16,9 +16,9 @@ julia> scatter([(1,4),(2,5),(3,6)])
bar(x,y)
bar!(x,y)
Make a bar plot of y vs x.
Make a bar plot of y vs x.
# Arguments
# Arguments
- $(_document_argument("bar_position"))
- $(_document_argument("bar_width"))
@@ -26,7 +26,7 @@ Make a bar plot of y vs x.
- $(_document_argument("orientation"))
# Examples
```julia-repl
```julia-repl
julia> bar([1,2,3],[4,5,6],fillcolor=[:red,:green,:blue],fillalpha=[0.2,0.4,0.6])
julia> bar([(1,4),(2,5),(3,6)])
```
@@ -41,7 +41,7 @@ julia> bar([(1,4),(2,5),(3,6)])
Plot a histogram.
# Arguments
# Arguments
- `x`: AbstractVector of values to be binned
- $(_document_argument("bins"))
@@ -53,7 +53,7 @@ Plot a histogram.
- $(_document_argument("orientation"))
# Example
```julia-repl
```julia-repl
julia> histogram([1,2,1,1,4,3,8],bins=0:8)
```
"""
@@ -63,7 +63,7 @@ julia> histogram([1,2,1,1,4,3,8],bins=0:8)
barhist(x)
barhist!(x)
Make a histogram bar plot. See `histogram`.
Make a histogram bar plot. See `histogram`.
"""
@shorthands barhist
@@ -72,7 +72,7 @@ Make a histogram bar plot. See `histogram`.
stephist(x)
Make a histogram step plot (bin counts are represented using horizontal lines
instead of bars). See `histogram`.
instead of bars). See `histogram`.
"""
@shorthands stephist
@@ -80,8 +80,8 @@ instead of bars). See `histogram`.
scatterhist(x)
scatterhist!(x)
Make a histogram scatter plot (bin counts are represented using points
instead of bars). See `histogram`.
Make a histogram scatter plot (bin counts are represented using points
instead of bars). See `histogram`.
"""
@shorthands scatterhist
@@ -91,14 +91,14 @@ instead of bars). See `histogram`.
Plot a two-dimensional histogram.
# Arguments
# Arguments
- `bins`: Number of bins (if an `Integer`) or bin edges (if an `AbtractVector`)
- `weights`: Vector of weights for the values in `x`. Each entry of x contributes
its weight to the height of its bin.
- `bins`: Number of bins (if an `Integer`) or bin edges (if an `AbtractVector`)
- `weights`: Vector of weights for the values in `x`. Each entry of x contributes
its weight to the height of its bin.
# Example
```julia-repl
```julia-repl
julia> histogram2d(randn(10_000),randn(10_000))
```
"""
@@ -108,14 +108,14 @@ julia> histogram2d(randn(10_000),randn(10_000))
density(x)
density!(x)
Make a line plot of a kernel density estimate of x.
Make a line plot of a kernel density estimate of x.
# Arguments
- `x`: AbstractVector of samples for probability density estimation
- `x`: AbstractVector of samples for probability density estimation
# Example
```julia-repl
```julia-repl
julia> using StatsPlots
julia> density(randn(100_000))
```
@@ -126,10 +126,10 @@ julia> density(randn(100_000))
heatmap(x,y,z)
heatmap!(x,y,z)
Plot a heatmap of the rectangular array `z`.
Plot a heatmap of the rectangular array `z`.
# Example
```julia-repl
```julia-repl
julia> heatmap(randn(10,10))
```
"""
@@ -140,7 +140,7 @@ julia> heatmap(randn(10,10))
hexbin(x,y)
hexbin!(x,y)
Make a hexagonal binning plot (a histogram of the observations `(x[i],y[i])`
Make a hexagonal binning plot (a histogram of the observations `(x[i],y[i])`
with hexagonal bins)
# Example
@@ -154,11 +154,11 @@ julia> hexbin(randn(10_000), randn(10_000))
sticks(x,y)
sticks!(x,y)
Draw a stick plot of y vs x.
Draw a stick plot of y vs x.
# Example
```julia-repl
julia> sticks(1:10)
julia> sticks(1:10)
```
"""
@shorthands sticks
@@ -167,11 +167,11 @@ julia> sticks(1:10)
hline(y)
hline!(y)
Draw horizontal lines at positions specified by the values in
Draw horizontal lines at positions specified by the values in
the AbstractVector `y`
# Example
```julia-repl
```julia-repl
julia> hline([-1,0,2])
```
"""
@@ -181,11 +181,11 @@ julia> hline([-1,0,2])
vline(x)
vline!(x)
Draw vertical lines at positions specified by the values in
Draw vertical lines at positions specified by the values in
the AbstractVector `x`
# Example
```julia-repl
```julia-repl
julia> vline([-1,0,2])
```
"""
@@ -194,13 +194,13 @@ julia> vline([-1,0,2])
"""
hspan(y)
Draw a rectangle between the horizontal line at position `y[1]`
and the horizontal line at position `y[2]`. If `length(y) ≥ 4`,
then further rectangles are drawn between `y[3]` and `y[4]`,
`y[5]` and `y[6]`, and so on. If `length(y)` is odd, then the
last entry of `y` is ignored.
Draw a rectangle between the horizontal line at position `y[1]`
and the horizontal line at position `y[2]`. If `length(y) ≥ 4`,
then further rectangles are drawn between `y[3]` and `y[4]`,
`y[5]` and `y[6]`, and so on. If `length(y)` is odd, then the
last entry of `y` is ignored.
# Example
```julia-repl
```julia-repl
julia> hspan(1:6)
```
"""
@@ -209,13 +209,13 @@ julia> hspan(1:6)
"""
vspan(x)
Draw a rectangle between the vertical line at position `x[1]`
and the vertical line at position `x[2]`. If `length(x) ≥ 4`,
then further rectangles are drawn between `x[3]` and `x[4]`,
`x[5]` and `x[6]`, and so on. If `length(x)` is odd, then the
last entry of `x` is ignored.
Draw a rectangle between the vertical line at position `x[1]`
and the vertical line at position `x[2]`. If `length(x) ≥ 4`,
then further rectangles are drawn between `x[3]` and `x[4]`,
`x[5]` and `x[6]`, and so on. If `length(x)` is odd, then the
last entry of `x` is ignored.
# Example
```julia-repl
```julia-repl
julia> vspan(1:6)
```
"""
@@ -225,9 +225,9 @@ julia> vspan(1:6)
ohlc(x,y::Vector{OHLC})
ohlc!(x,y::Vector{OHLC})
Make open-high-low-close plot. Each entry of y is represented by a vertical
segment extending from the low value to the high value, with short horizontal
segments on the left and right indicating the open and close values, respectively.
Make open-high-low-close plot. Each entry of y is represented by a vertical
segment extending from the low value to the high value, with short horizontal
segments on the left and right indicating the open and close values, respectively.
# Example
```julia-repl
@@ -240,16 +240,16 @@ julia> ohlc(y)
"""
contour(x,y,z)
contour!(x,y,z)
contour(x,y,z)
contour!(x,y,z)
Draw contour lines of the `Surface` z.
Draw contour lines of the `Surface` z.
# Arguments
- `levels`: Contour levels (if `AbstractVector`) or number of levels (if `Integer`)
- `fill`: Bool. Fill area between contours or draw contours only (false by default)
# Example
# Example
```julia-repl
julia> x = y = range(-20, 20, length = 100)
julia> contour(x, y, (x, y) -> x^2 + y^2)
@@ -267,10 +267,10 @@ julia> contour(x, y, (x, y) -> x^2 + y^2)
surface(x,y,z)
surface!(x,y,z)
Draw a 3D surface plot.
Draw a 3D surface plot.
# Example
```julia-repl
```julia-repl
julia> x = y = range(-3, 3, length = 100)
julia> surface(x, y, (x, y) -> sinc(norm([x, y])))
```
@@ -281,10 +281,10 @@ julia> surface(x, y, (x, y) -> sinc(norm([x, y])))
wireframe(x,y,z)
wireframe!(x,y,z)
Draw a 3D wireframe plot.
Draw a 3D wireframe plot.
# Example
```julia-repl
```julia-repl
julia> wireframe(1:10,1:10,randn(10,10))
```
"""
@@ -295,10 +295,10 @@ julia> wireframe(1:10,1:10,randn(10,10))
path3d!(x,y,z)
Plot a 3D path from `(x[1],y[1],z[1])` to `(x[2],y[2],z[2])`,
..., to `(x[end],y[end],z[end])`.
..., to `(x[end],y[end],z[end])`.
# Example
```julia-repl
```julia-repl
julia> path3d([0,1,2,3],[0,1,4,9],[0,1,8,27])
```
"""
@@ -308,10 +308,10 @@ julia> path3d([0,1,2,3],[0,1,4,9],[0,1,8,27])
scatter3d(x,y,z)
scatter3d!(x,y,z)
Make a 3D scatter plot.
Make a 3D scatter plot.
# Example
```julia-repl
```julia-repl
julia> scatter3d([0,1,2,3],[0,1,4,9],[0,1,8,27])
```
"""
@@ -321,17 +321,17 @@ julia> scatter3d([0,1,2,3],[0,1,4,9],[0,1,8,27])
boxplot(x, y)
boxplot!(x, y)
Make a box and whisker plot.
Make a box and whisker plot.
# Keyword arguments
- `notch`: Bool. Notch the box plot? (false)
- `range`: Real. Values more than range*IQR below the first quartile
or above the third quartile are shown as outliers (1.5)
- `outliers`: Bool. Show outliers? (true)
- `whisker_width`: Real or Symbol. Length of whiskers (:match)
or above the third quartile are shown as outliers (1.5)
- `outliers`: Bool. Show outliers? (true)
- `whisker_width`: Real or Symbol. Length of whiskers (:match)
# Example
```julia-repl
```julia-repl
julia> using StatsPlots
julia> boxplot(repeat([1,2,3],outer=100),randn(300))
```
@@ -342,10 +342,10 @@ julia> boxplot(repeat([1,2,3],outer=100),randn(300))
violin(x,y,z)
violin!(x,y,z)
Make a violin plot.
Make a violin plot.
# Example
```julia-repl
```julia-repl
julia> violin(repeat([1,2,3],outer=100),randn(300))
```
"""
@@ -355,11 +355,11 @@ julia> violin(repeat([1,2,3],outer=100),randn(300))
quiver(x,y,quiver=(u,v))
quiver!(x,y,quiver=(u,v))
Make a quiver (vector field) plot. The `i`th vector extends
from `(x[i],y[i])` to `(x[i] + u[i], y[i] + v[i])`.
Make a quiver (vector field) plot. The `i`th vector extends
from `(x[i],y[i])` to `(x[i] + u[i], y[i] + v[i])`.
# Example
```julia-repl
```julia-repl
julia> quiver([1,2,3],[3,2,1],quiver=([1,1,1],[1,2,3]))
```
"""
@@ -369,11 +369,11 @@ julia> quiver([1,2,3],[3,2,1],quiver=([1,1,1],[1,2,3]))
curves(x,y)
curves!(x,y)
Draw a Bezier curve from `(x[1],y[1])` to `(x[end],y[end])`
Draw a Bezier curve from `(x[1],y[1])` to `(x[end],y[end])`
with control points `(x[2],y[2]), ..., (x[end-1],y[end]-1)`
# Example
```julia-repl
```julia-repl
julia> curves([1,2,3,4],[1,1,2,4])
```
"""
@@ -424,9 +424,9 @@ ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} =
"""
annotate!(anns...)
Add annotations to an existing plot.
Add annotations to an existing plot.
# Arguments
# Arguments
- `anns`: An `AbstractVector` of tuples of the form (x,y,text). The text object
can be an String or PlotText
+13 -14
View File
@@ -271,18 +271,17 @@ maketuple(x::Tuple{T,S}) where {T,S} = x
mapFuncOrFuncs(f::Function, u::AVec) = map(f, u)
mapFuncOrFuncs(fs::AVec{F}, u::AVec) where {F<:Function} = [map(f, u) for f in fs]
unzip(xy::AVec{Tuple{X,Y}}) where {X,Y} = [t[1] for t in xy], [t[2] for t in xy]
unzip(xyz::AVec{Tuple{X,Y,Z}}) where {X,Y,Z} = [t[1] for t in xyz], [t[2] for t in xyz], [t[3] for t in xyz]
unzip(xyuv::AVec{Tuple{X,Y,U,V}}) where {X,Y,U,V} = [t[1] for t in xyuv], [t[2] for t in xyuv], [t[3] for t in xyuv], [t[4] for t in xyuv]
for i in 2:4
@eval begin
unzip(v::Union{AVec{<:Tuple{Vararg{T,$i} where T}},
AVec{<:GeometryTypes.Point{$i}}}) = $(Expr(:tuple, (:([t[$j] for t in v]) for j=1:i)...))
end
end
unzip(xy::AVec{GeometryTypes.Point{2,T}}) where {T} = T[t[1] for t in xy], T[t[2] for t in xy]
unzip(xy::GeometryTypes.Point{2,T}) where {T} = T[xy[1]], T[xy[2]]
unzip(xyz::AVec{GeometryTypes.Point{3,T}}) where {T} = T[t[1] for t in xyz], T[t[2] for t in xyz], T[t[3] for t in xyz]
unzip(xyz::GeometryTypes.Point{3,T}) where {T} = T[xyz[1]], T[xyz[2]], T[xyz[3]]
unzip(xyuv::AVec{GeometryTypes.Point{4,T}}) where {T} = T[t[1] for t in xyuv], T[t[2] for t in xyuv], T[t[3] for t in xyuv], T[t[4] for t in xyuv]
unzip(xyuv::GeometryTypes.Point{4,T}) where {T} = T[xyuv[1]], T[xyuv[2]], T[xyuv[3]], T[xyuv[4]]
unzip(v::Union{AVec{<:GeometryTypes.Point{N}},
AVec{<:Tuple{Vararg{T,N} where T}}}) where N = error("$N-dimensional unzip not implemented.")
unzip(v::Union{AVec{<:GeometryTypes.Point},
AVec{<:Tuple}}) = error("Can't unzip points of different dimensions.")
# given 2-element lims and a vector of data x, widen lims to account for the extrema of x
function _expand_limits(lims, x)
@@ -528,9 +527,9 @@ function get_clims(sp::Subplot)
z_colored_series = (:contour, :contour3d, :heatmap, :histogram2d, :surface)
for series in series_list(sp)
for vals in (series[:seriestype] in z_colored_series ? series[:z] : nothing, series[:line_z], series[:marker_z], series[:fill_z])
if (typeof(vals) <: AbstractSurface) && (eltype(vals.surf) <: Real)
if (typeof(vals) <: AbstractSurface) && (eltype(vals.surf) <: Union{Missing, Real})
zmin, zmax = _update_clims(zmin, zmax, ignorenan_extrema(vals.surf)...)
elseif (vals != nothing) && (eltype(vals) <: Real)
elseif (vals != nothing) && (eltype(vals) <: Union{Missing, Real})
zmin, zmax = _update_clims(zmin, zmax, ignorenan_extrema(vals)...)
end
end
@@ -655,7 +654,7 @@ function has_attribute_segments(series::Series)
end
series[:seriestype] == :shape && return false
# ... else we check relevant attributes if they have multiple inputs
return any((typeof(series[attr]) <: AbstractVector && length(series[attr]) > 1) for attr in [:seriescolor, :seriesalpha, :linecolor, :linealpha, :linewidth, :fillcolor, :fillalpha, :markercolor, :markeralpha, :markerstrokecolor, :markerstrokealpha]) || any(typeof(series[attr]) <: AbstractArray{<:Real} for attr in (:line_z, :fill_z, :marker_z))
return any((typeof(series[attr]) <: AbstractVector && length(series[attr]) > 1) for attr in [:seriescolor, :seriesalpha, :linecolor, :linealpha, :linewidth, :fillcolor, :fillalpha, :markercolor, :markeralpha, :markerstrokecolor, :markerstrokealpha]) || any(typeof(series[attr]) <: AbstractArray for attr in (:line_z, :fill_z, :marker_z))
end
# ---------------------------------------------------------------
+12
View File
@@ -4,6 +4,7 @@ using Random
using BinaryProvider
using Test
using FileIO
using GeometryTypes
include("imgcomp.jl")
# don't actually show the plots
@@ -81,3 +82,14 @@ end
@test segments([NaN; 1], 1:10) == [2:2, 4:4, 6:6, 8:8, 10:10]
@test segments([nan10; 1:15], [1:15; nan10]) == [11:15]
end
@testset "Utils" begin
zipped = ([(1,2)], [("a","b")], [(1,"a"),(2,"b")],
[(1,2),(3,4)], [(1,2,3),(3,4,5)], [(1,2,3,4),(3,4,5,6)],
[(1,2.0),(missing,missing)], [(1,missing),(missing,"a")],
[(missing,missing)], [(missing,missing,missing),("a","b","c")])
for z in zipped
@test isequal(collect(zip(Plots.unzip(z)...)), z)
@test isequal(collect(zip(Plots.unzip(Point.(z))...)), z)
end
end