From 851fe9f72c2137954f375b7cc952cc5f9fbcfd0a Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Tue, 24 May 2016 12:38:52 -0400 Subject: [PATCH] plotlyjs fixes --- src/args.jl | 1 + src/backends/plotly.jl | 26 +++++++-------- src/backends/plotlyjs.jl | 71 ++++++++++++++++++++++------------------ 3 files changed, 54 insertions(+), 44 deletions(-) diff --git a/src/args.jl b/src/args.jl index ad4cae15..6c75f1fc 100644 --- a/src/args.jl +++ b/src/args.jl @@ -59,6 +59,7 @@ is3d(d::KW) = trueOrAllTrue(is3d, d[:seriestype]) is3d(sp::Subplot) = string(sp.attr[:projection]) == "3d" ispolar(sp::Subplot) = string(sp.attr[:projection]) == "polar" +ispolar(series::Series) = ispolar(series.d[:subplot]) const _allStyles = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] @compat const _styleAliases = KW( diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index 9c6e0a42..654ffa49 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -218,7 +218,7 @@ use_axis_field(ticks) = !(ticks in (nothing, :none)) # labelsym(letter) = symbol(letter * "label") # rotationsym(letter) = symbol(letter * "rotation") -function plotlyaxis(axis::Axis, sp::Subplot{PlotlyBackend}) +function plotly_axis(axis::Axis, sp::Subplot) letter = axis[:letter] d = axis.d ax = KW( @@ -273,10 +273,10 @@ function plotlyaxis(axis::Axis, sp::Subplot{PlotlyBackend}) ax end -# function get_plot_json(plt::Plot{PlotlyBackend}) +# function plotly_layout_json(plt::Plot{PlotlyBackend}) # d = plt.attr # function plotly_layout(d::KW, seriesargs::AVec{KW}) -function plotly_layout(plt::Plot{PlotlyBackend}) +function plotly_layout(plt::Plot) d_out = KW() # for now, we only support 1 subplot @@ -302,13 +302,13 @@ function plotly_layout(plt::Plot{PlotlyBackend}) # if any(is3d, seriesargs) if is3d(sp) d_out[:scene] = KW( - :xaxis => plotlyaxis(sp.attr[:xaxis], sp), - :yaxis => plotlyaxis(sp.attr[:yaxis], sp), - :xzxis => plotlyaxis(sp.attr[:zaxis], sp), + :xaxis => plotly_axis(sp.attr[:xaxis], sp), + :yaxis => plotly_axis(sp.attr[:yaxis], sp), + :xzxis => plotly_axis(sp.attr[:zaxis], sp), ) else - d_out[:xaxis] = plotlyaxis(sp.attr[:xaxis], sp) - d_out[:yaxis] = plotlyaxis(sp.attr[:yaxis], sp) + d_out[:xaxis] = plotly_axis(sp.attr[:xaxis], sp) + d_out[:yaxis] = plotly_axis(sp.attr[:yaxis], sp) end # legend @@ -354,7 +354,7 @@ function plotly_layout(plt::Plot{PlotlyBackend}) d_out end -function get_plot_json(plt::Plot{PlotlyBackend}) +function plotly_layout_json(plt::Plot) JSON.json(plotly_layout(plt)) end @@ -375,7 +375,7 @@ const _plotly_markers = KW( ) # get a dictionary representing the series params (d is the Plots-dict, d_out is the Plotly-dict) -function plotly_series(plt::Plot{PlotlyBackend}, series::Series) +function plotly_series(plt::Plot, series::Series) d = series.d d_out = KW() @@ -520,7 +520,7 @@ function plotly_series(plt::Plot{PlotlyBackend}, series::Series) end # get a list of dictionaries, each representing the series params -function get_series_json(plt::Plot{PlotlyBackend}) +function plotly_series_json(plt::Plot) JSON.json(map(series -> plotly_series(plt, series), plt.series_list)) end @@ -540,7 +540,7 @@ function html_body(plt::Plot{PlotlyBackend}, style = nothing)
""" html @@ -549,7 +549,7 @@ end function js_body(plt::Plot{PlotlyBackend}, uuid) js = """ PLOT = document.getElementById('$(uuid)'); - Plotly.plot(PLOT, $(get_series_json(plt)), $(get_plot_json(plt))); + Plotly.plot(PLOT, $(plotly_series_json(plt)), $(plotly_layout_json(plt))); """ end diff --git a/src/backends/plotlyjs.jl b/src/backends/plotlyjs.jl index 1c7c65e3..3e8cd492 100644 --- a/src/backends/plotlyjs.jl +++ b/src/backends/plotlyjs.jl @@ -114,11 +114,11 @@ end function _series_added(plt::Plot{PlotlyJSBackend}, series::Series) - d = series.d + # d = series.d syncplot = plt.o # add to the data array - pdict = plotly_series(d, plt.attr) + pdict = plotly_series(plt, series) typ = pop!(pdict, :type) gt = PlotlyJS.GenericTrace(typ; pdict...) PlotlyJS.addtraces!(syncplot, gt) @@ -131,30 +131,30 @@ end # --------------------------------------------------------------------------- -function _add_annotations{X,Y,V}(plt::Plot{PlotlyJSBackend}, anns::AVec{@compat(Tuple{X,Y,V})}) - # set or add to the annotation_list - if !haskey(plt.attr, :annotation_list) - plt.attr[:annotation_list] = Any[] - end - append!(plt.attr[:annotation_list], anns) -end +# function _add_annotations{X,Y,V}(plt::Plot{PlotlyJSBackend}, anns::AVec{@compat(Tuple{X,Y,V})}) +# # set or add to the annotation_list +# if !haskey(plt.attr, :annotation_list) +# plt.attr[:annotation_list] = Any[] +# end +# append!(plt.attr[:annotation_list], anns) +# end # ---------------------------------------------------------------- -function _before_update_plot(plt::Plot{PlotlyJSBackend}) -end +# function _before_update_plot(plt::Plot{PlotlyJSBackend}) +# end # TODO: override this to update plot items (title, xlabel, etc) after creation function _update_plot(plt::Plot{PlotlyJSBackend}, d::KW) - pdict = plotly_layout(plt.attr, plt.seriesargs) + pdict = plotly_layout(plt) syncplot = plt.o - w,h = d[:size] + w,h = plt.attr[:size] PlotlyJS.relayout!(syncplot, pdict, width = w, height = h) end -function _update_plot_pos_size(plt::AbstractPlot{PlotlyJSBackend}, d::KW) -end +# function _update_plot_pos_size(plt::AbstractPlot{PlotlyJSBackend}, d::KW) +# end # ---------------------------------------------------------------- @@ -165,17 +165,26 @@ end # d[:x], d[:y] # end -function setxy!{X,Y}(plt::Plot{PlotlyJSBackend}, xy::Tuple{X,Y}, i::Integer) - d = plt.seriesargs[i] - ispolar = get(plt.attr, :polar, false) - xsym = ispolar ? :t : :x - ysym = ispolar ? :r : :y - d[xsym], d[ysym] = xy - # TODO: this is likely ineffecient... we should make a call that ONLY changes the plot data - PlotlyJS.restyle!(plt.o, i, KW(xsym=>(d[xsym],), ysym=>(d[ysym],))) - plt +function _series_updated(plt::Plot{PlotlyJSBackend}, series::Series) + xsym, ysym = (ispolar(series) ? (:t,:r) : (:x,:y)) + PlotlyJS.restyle!( + plt.o, + findfirst(plt.series_list, series), + KW(xsym => series.d[:x], ysym => series.d[:y]) + ) end +# function setxy!{X,Y}(plt::Plot{PlotlyJSBackend}, xy::Tuple{X,Y}, i::Integer) +# d = plt.seriesargs[i] +# ispolar = get(plt.attr, :polar, false) +# xsym = ispolar ? :t : :x +# ysym = ispolar ? :r : :y +# d[xsym], d[ysym] = xy +# # TODO: this is likely ineffecient... we should make a call that ONLY changes the plot data +# PlotlyJS.restyle!(plt.o, i, KW(xsym=>(d[xsym],), ysym=>(d[ysym],))) +# plt +# end + # ---------------------------------------------------------------- # function _create_subplot(subplt::Subplot{PlotlyJSBackend}, isbefore::Bool) @@ -183,13 +192,13 @@ end # true # end -function _expand_limits(lims, plt::Plot{PlotlyJSBackend}, isx::Bool) - # TODO: call expand limits for each plot data -end - -function _remove_axis(plt::Plot{PlotlyJSBackend}, isx::Bool) - # TODO: if plot is inner subplot, might need to remove ticks or axis labels -end +# function _expand_limits(lims, plt::Plot{PlotlyJSBackend}, isx::Bool) +# # TODO: call expand limits for each plot data +# end +# +# function _remove_axis(plt::Plot{PlotlyJSBackend}, isx::Bool) +# # TODO: if plot is inner subplot, might need to remove ticks or axis labels +# end # ----------------------------------------------------------------