问题
Plots
is simple and powerful but sometimes I would like to have a little bit more control over individual elements of the plot to fine-tune its appearance.
Is it possible to update the plot object of the backend directly?
E.g., for the default pyplot
backend, I tried
using Plots
p = plot(sin)
p.o[:axes][1][:xaxis][:set_ticks_position]("top")
but the plot does not change. Calling p.o[:show]()
afterwards does not help, either.
In other words: Is there a way to use the PyPlot
interface for a plot that was initially created with Plots
?
Edit:
The changes to the PyPlot
object become visible (also in the gui) when saving the figure:
using Plots
using PyPlot
p = Plots.plot(sin, top_margin=1cm)
gui() # not needed when using the REPL
gca()[:xaxis][:set_ticks_position]("top")
PyPlot.savefig("test.png")
Here, I used p.o[:axes][1] == gca()
. One has to set top_margin=1cm
because the plot area is not adjusted automatically (for my actual fine-tuning, this doesn't matter).
This also works for subsequent updates as long as only the PyPlot
interface is used. E.g., after the following commands, the plot will have a red right border in addition to labels at the top:
gca()[:spines]["right"][:set_color]("red")
PyPlot.savefig("test.png")
However, when a Plots
command like plot!(xlabel="foo")
is used, all previous changes made with PyPlot
are overwritten (which is not suprising).
The remaining question is how to update the gui interactively without having to call PyPlot.savefig
explicitly.
回答1:
No - the plot is a Plots object, not a PyPlot object. In your specific example you can do plot(sin, xmirror = true
).
回答2:
I'm trying to do the same but didn't find a solution to update an existing plot. But here is a partial answer: you can query information from the PyPlot axes object
julia> Plots.plot(sin, 1:4)
julia> Plots.PyPlot.plt[:xlim]()
(1.0,4.0)
julia> Plots.plot(sin, 20:24)
julia> ax = Plots.PyPlot.plt[:xlim]()
(20.0,24.0)
and it gets updated.
来源:https://stackoverflow.com/questions/42699800/accessing-backend-specific-functionality-with-julia-plots