Plots.jl
Plots.jl copied to clipboard
[BUG] savefig function and legend argument don't work with Plotly
Details
julia> using Plots
julia> plotly()
Plots.PlotlyBackend()
julia> plot(1:3, 4:6, label="y", legend=:left)
julia> savefig("test.png")
ERROR: UndefVarError: savefig not defined
Stacktrace:
[1] _show(io::IOStream, #unused#::MIME{Symbol("image/png")}, plt::Plots.Plot{Plots.PlotlyBackend})
@ Plots C:\Users\nboyer.AIP\.julia\packages\Plots\hxZ0l\src\backends\plotlybase.jl:21
[2] show
@ C:\Users\nboyer.AIP\.julia\packages\Plots\hxZ0l\src\output.jl:214 [inlined]
[3] png(plt::Plots.Plot{Plots.PlotlyBackend}, fn::String)
@ Plots C:\Users\nboyer.AIP\.julia\packages\Plots\hxZ0l\src\output.jl:7
[4] savefig(plt::Plots.Plot{Plots.PlotlyBackend}, fn::String)
@ Plots C:\Users\nboyer.AIP\.julia\packages\Plots\hxZ0l\src\output.jl:123
[5] savefig(fn::String)
@ Plots C:\Users\nboyer.AIP\.julia\packages\Plots\hxZ0l\src\output.jl:128
[6] top-level scope
@ REPL[4]:1
The legend keyword argument is ignored, and the savefig
function cannot be found. savefig
works on PlotlyJS backend, but legend
still doesn't.
Backends
This bug occurs on ( insert x
below )
Backend | yes | no | untested |
---|---|---|---|
gr (default) | x | ||
pyplot | x | ||
plotlyjs | x | ||
pgfplotsx | x | ||
unicodeplots | x | ||
inspectdr | x | ||
gaston | x |
Versions
Plots.jl version: v1.25.10
Backend version (]st -m <backend(s)>
): v0.4.1
Output of versioninfo()
:
julia> versioninfo()
Julia Version 1.7.1
Commit ac5cc99908 (2021-12-22 19:35 UTC)
Platform Info:
OS: Windows (x86_64-w64-mingw32)
CPU: Intel(R) Core(TM) i7-9700 CPU @ 3.00GHz
WORD_SIZE: 64
LIBM: libopenlibm
LLVM: libLLVM-12.0.1 (ORCJIT, skylake)
Environment:
JULIA_EDITOR = code.cmd
JULIA_NUM_THREADS =
I'm getting this error too. I don't know how this made it past unit tests, because it's simple that using PlotlyBase
doesn't allow you to use savefig
anymore (i.e., it fails even without using legend
):
(tmp) pkg> add Plots, PlotlyBase
# ...
julia> using Plots
julia> plotly()
Plots.PlotlyBackend()
julia> plt = plot(1:3, 4:6)
julia> savefig(plt, "test.pdf")
ERROR: UndefVarError: savefig not defined
Stacktrace:
[1] _show(io::IOStream, #unused#::MIME{Symbol("application/pdf")}, plt::Plots.Plot{Plots.PlotlyBackend})
@ Plots ~/.julia/packages/Plots/LI4FE/src/backends/plotlybase.jl:21
[2] show
@ ~/.julia/packages/Plots/LI4FE/src/output.jl:205 [inlined]
[3] #277
@ ~/.julia/packages/Plots/LI4FE/src/output.jl:20 [inlined]
[4] open(::Plots.var"#277#278"{Plots.Plot{Plots.PlotlyBackend}}, ::String, ::Vararg{String}; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
@ Base ./io.jl:330
[5] open
@ ./io.jl:328 [inlined]
[6] pdf(plt::Plots.Plot{Plots.PlotlyBackend}, fn::String)
@ Plots ~/.julia/packages/Plots/LI4FE/src/output.jl:19
[7] savefig(plt::Plots.Plot{Plots.PlotlyBackend}, fn::String)
@ Plots ~/.julia/packages/Plots/LI4FE/src/output.jl:114
[8] top-level scope
@ REPL[4]:1
Presumably PlotlyJS
works (but not PlotlyBase
). It looks like PlotlyBase
has removed their savefig
function which Plots
calls here, rather, suggesting to use PlotlyJS
to export figures. Someone has pointed out that it's probably a bit bloated to have to load PlotlyJS
to export figures, so they've made a PlotlySave
package, which looks neat, and which exports savefig
without loading PlotlyJS
.
... and which exports
savefig
without loadingPlotlyJS
.
Just to avoid misunderstandings or frustration; PlotlySave
does not export savefig()
in order not to collide with PlotlyJS's definition. It does export FileIO's save(filename, fig)
instead, and it does provide the possibility to actively import savefig()
.
So in order to use old scripts, I'd recommend doing
using PlotlySave
import PlotlySave.savefig
savefig(myplot, "myplot.svg")
otherwise do
using PlotlySave
save("myplot.svg", myplot)