2017-03-09 35 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'正確地更新了情節,但爲什麼我無法偷偷摸摸。我想我的朱利亞技能不夠好,我應該使用調試器來查看實際調用的內容。 –