7

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显式调用。

4

2 回答 2

1

否 - 绘图是 Plots 对象,而不是 PyPlot 对象。在您的具体示例中,您可以这样做plot(sin, xmirror = true)。

于 2017-03-10T08:43:02.720 回答
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)

它得到更新。

于 2017-03-10T13:14:58.483 回答