diff --git a/src/arg_desc.jl b/src/arg_desc.jl index b4503c1e..4efbf1af 100644 --- a/src/arg_desc.jl +++ b/src/arg_desc.jl @@ -29,6 +29,7 @@ const _arg_desc = KW( :z => "Various. Input data. Third Dimension. May be wrapped by a `Surface` for surface and heatmap types.", :marker_z => "AbstractVector, Function `f(x,y,z) -> z_value`, or nothing. z-values for each series data point, which correspond to the color to be used from a markercolor gradient.", :line_z => "AbstractVector, Function `f(x,y,z) -> z_value`, or nothing. z-values for each series line segment, which correspond to the color to be used from a linecolor gradient. Note that for N points, only the first N-1 values are used (one per line-segment).", +:fill_z => "Matrix{Float64} of the same size as z matrix, which specifies the color of the 3D surface; the default value is `nothing`.", :levels => "Integer, NTuple{2,Integer}. Number of levels (or x-levels/y-levels) for a contour type.", :orientation => "Symbol. Horizontal or vertical orientation for bar types. Values `:h`, `:hor`, `:horizontal` correspond to horizontal (sideways, anchored to y-axis), and `:v`, `:vert`, and `:vertical` correspond to vertical (the default).", :bar_position => "Symbol. Choose from `:overlay` (default), `:stack`. (warning: May not be implemented fully)", diff --git a/src/args.jl b/src/args.jl index 119dd125..8f82fec0 100644 --- a/src/args.jl +++ b/src/args.jl @@ -188,6 +188,7 @@ const _series_defaults = KW( :z => nothing, # depth for contour, surface, etc :marker_z => nothing, # value for color scale :line_z => nothing, + :fill_z => nothing, :levels => 15, :orientation => :vertical, :bar_position => :overlay, # for bar plots and histograms: could also be stack (stack up) or dodge (side by side) @@ -431,6 +432,7 @@ add_aliases(:zguide, :zlabel, :zlab, :zl) add_aliases(:zlims, :zlim, :zlimit, :zlimits) add_aliases(:zticks, :ztick) add_aliases(:zrotation, :zrot, :zr) +add_aliases(:fill_z, :fillz, :fz, :surfacecolor, :surfacecolour, :sc, :surfcolor, :surfcolour) add_aliases(:legend, :leg, :key) add_aliases(:colorbar, :cb, :cbar, :colorkey) add_aliases(:clims, :clim, :cbarlims, :cbar_lims, :climits, :color_limits) diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index a70ddf60..bbdd29b9 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -20,7 +20,7 @@ const _plotly_attr = merge_with_base_supported([ :guide, :lims, :ticks, :scale, :flip, :rotation, :tickfont, :guidefont, :legendfont, :grid, :legend, :colorbar, - :marker_z, :levels, + :marker_z, :fill_z, :levels, :ribbon, :quiver, :orientation, # :overwrite_figure, @@ -371,6 +371,7 @@ end plotly_colorscale(c, α) = plotly_colorscale(cgrad(alpha=α), α) # plotly_colorscale(c, alpha = nothing) = plotly_colorscale(cgrad(), alpha) + const _plotly_markers = KW( :rect => "square", :xcross => "x", @@ -488,6 +489,9 @@ function plotly_series(plt::Plot, series::Series) d_out[:contours] = KW(:x => wirelines, :y => wirelines, :z => wirelines) else d_out[:colorscale] = plotly_colorscale(series[:fillcolor], series[:fillalpha]) + if series[:fill_z] != nothing + d_out[:surfacecolor] = plotly_surface_data(series, series[:fill_z]) + end end elseif st == :pie diff --git a/src/series.jl b/src/series.jl index 02e9eca2..81307677 100644 --- a/src/series.jl +++ b/src/series.jl @@ -257,12 +257,23 @@ end # # 1 argument # # -------------------------------------------------------------------- +# helper function to ensure relevant attributes are wrapped by Surface +function wrap_surfaces(d::KW) + if haskey(d, :fill_z) + v = d[:fill_z] + if !isa(v, Surface) + d[:fill_z] = Surface(v) + end + end +end + @recipe f(n::Integer) = is3d(get(d,:seriestype,:path)) ? (SliceIt, n, n, n) : (SliceIt, n, n, nothing) # return a surface if this is a 3d plot, otherwise let it be sliced up @recipe function f{T<:Union{Integer,AbstractFloat}}(mat::AMat{T}) if all3D(d) n,m = size(mat) + wrap_surfaces(d) SliceIt, 1:m, 1:n, Surface(mat) else SliceIt, nothing, mat, nothing @@ -274,6 +285,7 @@ end if all3D(d) mat = fmt.data n,m = size(mat) + wrap_surfaces(d) SliceIt, 1:m, 1:n, Formatted(Surface(mat), fmt.formatter) else SliceIt, nothing, fmt, nothing @@ -400,6 +412,7 @@ end @recipe function f(x::AVec, y::AVec, zf::Function) # x = X <: Number ? sort(x) : x # y = Y <: Number ? sort(y) : y + wrap_surfaces(d) SliceIt, x, y, Surface(zf, x, y) # TODO: replace with SurfaceFunction when supported end @@ -410,6 +423,7 @@ end if !like_surface(get(d, :seriestype, :none)) d[:seriestype] = :contour end + wrap_surfaces(d) SliceIt, x, y, Surface(z) end