使用Julia Plots访问后端特定功能

时间:2017-03-09 15:53:39

标签: matplotlib julia plots.jl

Plots简单而有力,但有时候我想更多地控制情节中的各个元素来微调它的外观。

是否可以直接更新后端的绘图对象?

例如,对于默认的pyplot后端,我尝试了

using Plots
p = plot(sin)
p.o[:axes][1][:xaxis][:set_ticks_position]("top")

但情节不会改变。之后调用p.o[:show]()也无济于事。

换句话说:有没有办法将PyPlot界面用于最初使用Plots创建的地图?

修改

保存图形时,PyPlot对象的更改变为可见(也在gui中):

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")

在这里,我使用了p.o[:axes][1] == gca()。必须设置top_margin=1cm,因为绘图区域不会自动调整(对于我的实际微调,这没关系)。

只要仅使用PyPlot接口,这也适用于后续更新。例如,在以下命令之后,除了顶部的标签之外,绘图将具有红色右边框:

gca()[:spines]["right"][:set_color]("red")
PyPlot.savefig("test.png")

但是,当使用Plots这样的plot!(xlabel="foo")命令时,所有先前对PyPlot所做的更改都会被覆盖(这并不令人惊讶)。

剩下的问题是如何以交互方式更新gui而无需明确调用PyPlot.savefig

2 个答案:

答案 0 :(得分:1)

否 - 该图是一个Plots对象,而不是PyPlot对象。在您的具体示例中,您可以执行plot(sin, xmirror = true)。

答案 1 :(得分:1)

我正在尝试做同样的事情,但没有找到更新现有情节的解决方案。但这里有一个部分答案:您可以从PyPlot轴对象

查询信息
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)

它会更新。