2017-03-09 27 views
6

Plots非常简单而且功能强大,但有时我想对剧情的各个元素有更多的控制来微调其外观。访问Julia剧情的后端特定功能

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

例如,默认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") 

然而,当使用像plot!(xlabel="foo")一个Plots命令,此前已PyPlot所做的所有更改会被覆盖(这并不令人惊讶)。

剩下的问题是如何交互式地更新gui,而不必明确地调用PyPlot.savefig

回答

1

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

+0

但是,您可以使用图表符号直接编辑Plots对象。在这种情况下'p [1] [:xaxis] [:mirror] = true;显示(p)'。 display()对于任何要显示的图的更新都是必不可少的。 –

+0

我知道'p'是一个'Plots'对象,但它似乎在'p.o'中包装了至少部分功能性的'PyPlot'对象,请参阅我的更新问题以获得解决方法。当然,如果可能的话,应该使用'Plots'接口,就像在这个例子中一样,但是有时我只知道如何在'PyPlot'中做出特定的改变。因此,我希望在绘图的90%完成后,将控制完全交给'PyPlot'(当使用'pyplot'后端时)。 – tim

+0

非常令人印象深刻的黑客行为:-) –

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) 

,并得到更新。

+0

有趣。顺便说一句,你不需要在PyPlot前面绘制阴谋。 –

+0

但是如果这可以用来做任何事情来编辑剧情,我会非常惊讶。 –

+0

而我没有设法编辑剧情。我查看了“情节”。jl'一段时间的源代码,只是无法弄清楚为什么'Plots'正确地更新了情节,但为什么我无法偷偷摸摸。我想我的朱利亚技能不够好,我应该使用调试器来查看实际调用的内容。 –