103 lines
3.1 KiB
Julia
103 lines
3.1 KiB
Julia
|
|
# https://github.com/spencerlyon2/PlotlyJS.jl
|
|
|
|
const _plotlyjs_attr = _plotly_attr
|
|
const _plotlyjs_seriestype = _plotly_seriestype
|
|
const _plotlyjs_style = _plotly_style
|
|
const _plotlyjs_marker = _plotly_marker
|
|
const _plotlyjs_scale = _plotly_scale
|
|
|
|
# --------------------------------------------------------------------------------------
|
|
|
|
|
|
function _create_backend_figure(plt::Plot{PlotlyJSBackend})
|
|
if !isplotnull() && plt[:overwrite_figure] && isa(current().o, PlotlyJS.SyncPlot)
|
|
PlotlyJS.SyncPlot(PlotlyJS.Plot(), current().o.view)
|
|
else
|
|
PlotlyJS.plot()
|
|
end
|
|
end
|
|
|
|
|
|
function _series_added(plt::Plot{PlotlyJSBackend}, series::Series)
|
|
syncplot = plt.o
|
|
pdicts = plotly_series(plt, series)
|
|
for pdict in pdicts
|
|
typ = pop!(pdict, :type)
|
|
gt = PlotlyJS.GenericTrace(typ; pdict...)
|
|
PlotlyJS.addtraces!(syncplot, gt)
|
|
end
|
|
end
|
|
|
|
function _series_updated(plt::Plot{PlotlyJSBackend}, series::Series)
|
|
xsym, ysym = (ispolar(series) ? (:t,:r) : (:x,:y))
|
|
kw = KW(xsym => (series.plotattributes[:x],), ysym => (series.plotattributes[:y],))
|
|
z = series[:z]
|
|
if z != nothing
|
|
kw[:z] = (isa(z,Surface) ? transpose_z(series, series[:z].surf, false) : z,)
|
|
end
|
|
PlotlyJS.restyle!(
|
|
plt.o,
|
|
findfirst(isequal(series), plt.series_list),
|
|
kw
|
|
)
|
|
end
|
|
|
|
|
|
# ----------------------------------------------------------------
|
|
|
|
function _update_plot_object(plt::Plot{PlotlyJSBackend})
|
|
pdict = plotly_layout(plt)
|
|
syncplot = plt.o
|
|
w,h = plt[:size]
|
|
PlotlyJS.relayout!(syncplot, pdict, width = w, height = h)
|
|
end
|
|
|
|
|
|
# ----------------------------------------------------------------
|
|
|
|
function _show(io::IO, ::MIME"text/html", plt::Plot{PlotlyJSBackend})
|
|
if isijulia() && !_use_remote[]
|
|
write(io, PlotlyJS.html_body(PlotlyJS.JupyterPlot(plt.o)))
|
|
else
|
|
show(io, MIME("text/html"), plt.o)
|
|
end
|
|
end
|
|
|
|
function plotlyjs_save_hack(io::IO, plt::Plot{PlotlyJSBackend}, ext::String)
|
|
tmpfn = tempname() * "." * ext
|
|
PlotlyJS.savefig(plt.o, tmpfn)
|
|
write(io, read(open(tmpfn)))
|
|
end
|
|
_show(io::IO, ::MIME"image/svg+xml", plt::Plot{PlotlyJSBackend}) = plotlyjs_save_hack(io, plt, "svg")
|
|
_show(io::IO, ::MIME"image/png", plt::Plot{PlotlyJSBackend}) = plotlyjs_save_hack(io, plt, "png")
|
|
_show(io::IO, ::MIME"application/pdf", plt::Plot{PlotlyJSBackend}) = plotlyjs_save_hack(io, plt, "pdf")
|
|
_show(io::IO, ::MIME"image/eps", plt::Plot{PlotlyJSBackend}) = plotlyjs_save_hack(io, plt, "eps")
|
|
|
|
function write_temp_html(plt::Plot{PlotlyJSBackend})
|
|
filename = string(tempname(), ".html")
|
|
savefig(plt, filename)
|
|
filename
|
|
end
|
|
|
|
function _display(plt::Plot{PlotlyJSBackend})
|
|
if get(ENV, "PLOTS_USE_ATOM_PLOTPANE", true) in (true, 1, "1", "true", "yes")
|
|
display(plt.o)
|
|
else
|
|
standalone_html_window(plt)
|
|
end
|
|
end
|
|
|
|
@require WebIO = "0f1e0344-ec1d-5b48-a673-e5cf874b6c29" begin
|
|
function WebIO.render(plt::Plot{PlotlyJSBackend})
|
|
prepare_output(plt)
|
|
WebIO.render(plt.o)
|
|
end
|
|
end
|
|
|
|
function closeall(::PlotlyJSBackend)
|
|
if !isplotnull() && isa(current().o, PlotlyJS.SyncPlot)
|
|
close(current().o)
|
|
end
|
|
end
|