From cf4fcf335124c8884080df2ab1d3e163dbb22c73 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Tue, 7 Jun 2016 21:12:59 -0400 Subject: [PATCH] fixed boxplot grouping; cleaned up GroupBy recipe; added arg_descs --- src/arg_desc.jl | 30 +++++++++++++++--------------- src/plot.jl | 2 ++ src/recipes.jl | 6 +++--- src/series_new.jl | 27 ++++++++++++++++++++------- 4 files changed, 40 insertions(+), 25 deletions(-) diff --git a/src/arg_desc.jl b/src/arg_desc.jl index f5833c02..32287e5f 100644 --- a/src/arg_desc.jl +++ b/src/arg_desc.jl @@ -27,21 +27,21 @@ const _arg_desc = KW( :x => "Various. Input data. First Dimension", :y => "Various. Input data. Second Dimension", :z => "Various. Input data. Third Dimension. May be wrapped by a `Surface` for surface and heatmap types.", -:marker_z => "", -:levels => "", -:orientation => "", -:bar_position => "", -:bar_width => "", -:bar_edges => "", -:xerror => "", -:yerror => "", -:ribbon => "", -:quiver => "", -:arrow => "", -:normalize => "", -:weights => "", -:contours => "", -:match_dimensions => "", +:marker_z => "AbstractVector. z-values for each series data point, which correspond to the color to be used from a markercolor gradient.", +: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)", +:bar_width => "nothing or Number. Width of bars in data coordinates. When nothing, chooses based on x (or y when `orientation = :h`).", +:bar_edges => "Bool. Align bars to edges (true), or centers (the default)?", +:xerror => "AbstractVector or 2-Tuple of Vectors. x (horizontal) error relative to x-value. If 2-tuple of vectors, the first vector corresponds to the left error (and the second to the right)", +:yerror => "AbstractVector or 2-Tuple of Vectors. y (vertical) error relative to y-value. If 2-tuple of vectors, the first vector corresponds to the bottom error (and the second to the top)", +:ribbon => "Number or AbstractVector. Creates a fillrange around the data points.", +:quiver => "AbstractVector or 2-Tuple of vectors. The directional vectors U,V which specify velocity/gradient vectors for a quiver plot.", +:arrow => "nothing (no arrows), Bool (if true, default arrows), Arrow object, or arg(s) that could be style or head length/widths. Defines arrowheads that should be displayed at the end of path line segments (just before a NaN and the last non-NaN point). Used in quiverplot, streamplot, or similar.", +:normalize => "Bool. Should normalize histogram types? Trying for area == 1.", +:weights => "AbstractVector. Used in histogram types for weighted counts.", +:contours => "Bool. Add contours to the side-grids of 3D plots? Used in surface/wireframe.", +:match_dimensions => "Bool. For heatmap types... should the first dimension of a matrix (rows) correspond to the first dimension of the plot (x-axis)? The default is false, which matches the behavior of Matplotlib, Plotly, and others. Note: when passing a function for z, the function should still map `(x,y) -> z`.", :subplot => "", :series_annotations => "", :primary => "", diff --git a/src/plot.jl b/src/plot.jl index a784198b..7ae95c4e 100644 --- a/src/plot.jl +++ b/src/plot.jl @@ -274,6 +274,8 @@ function _plot!(plt::Plot, d::KW, args...) # we make a copy of the KW and apply an errorbar recipe errkw = copy(kw) errkw[:seriestype] = esym + errkw[:label] = "" + errkw[:primary] = false push!(kw_list, errkw) end end diff --git a/src/recipes.jl b/src/recipes.jl index c6221f15..cb2c7a0e 100644 --- a/src/recipes.jl +++ b/src/recipes.jl @@ -478,7 +478,7 @@ notch_width(q2, q4, N) = 1.58 * (q4-q2)/sqrt(N) end # make the shape - center = i - 0.5 + center = discrete_value!(d[:subplot][:xaxis], glabel)[1] l, m, r = center - _box_halfwidth, center, center + _box_halfwidth # internal nodes for notches L, R = center - 0.5 * _box_halfwidth, center + 0.5 * _box_halfwidth @@ -522,8 +522,8 @@ notch_width(q2, q4, N) = 1.58 * (q4-q2)/sqrt(N) # d[:plotarg_overrides] = KW(:xticks => (1:length(shapes), groupby.groupLabels)) seriestype := :shape - n = length(groupby.groupLabels) - xticks --> (linspace(0.5,n-0.5,n), groupby.groupLabels) + # n = length(groupby.groupLabels) + # xticks --> (linspace(0.5,n-0.5,n), groupby.groupLabels) # clean d pop!(d, :notch) diff --git a/src/series_new.jl b/src/series_new.jl index edcfec7b..3893eeaf 100644 --- a/src/series_new.jl +++ b/src/series_new.jl @@ -366,14 +366,27 @@ end # # handle grouping # # -------------------------------------------------------------------- +# @recipe function f(groupby::GroupBy, args...) +# for (i,glab) in enumerate(groupby.groupLabels) +# # create a new series, with the label of the group, and an idxfilter (to be applied in slice_and_dice) +# # TODO: use @series instead +# @show i, glab, groupby.groupIds[i] +# di = copy(d) +# get!(di, :label, string(glab)) +# get!(di, :idxfilter, groupby.groupIds[i]) +# push!(series_list, RecipeData(di, args)) +# end +# nothing +# end + +# split the group into 1 series per group, and set the label and idxfilter for each @recipe function f(groupby::GroupBy, args...) for (i,glab) in enumerate(groupby.groupLabels) - # create a new series, with the label of the group, and an idxfilter (to be applied in slice_and_dice) - # TODO: use @series instead - di = copy(d) - get!(di, :label, string(glab)) - get!(di, :idxfilter, groupby.groupIds[i]) - push!(series_list, RecipeData(di, args)) + @series begin + label --> string(glab) + idxfilter --> groupby.groupIds[i] + args + end end - nothing end +