2017-03-09 8 views
6

Plots jest prosty i potężny, ale czasami chciałbym mieć nieco większą kontrolę nad poszczególnymi elementami fabuły, aby dopracować jej wygląd.Dostęp do funkcji specyficznych dla backendu z działkami Julia

Czy można aktualizować obiekt wydruku bezpośrednio?

przykład dla domyślnego pyplot backend, próbowałem

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

ale fabuła nie zmienia. Dzwonienie pod numer p.o[:show]() również nie pomaga.

Innymi słowy: czy istnieje sposób użycia interfejsu PyPlot dla wykresu, który został początkowo utworzony za pomocą Plots?

Edit:

zmian w obiekcie PyPlot stają się widoczne (również w GUI) podczas zapisywania rysunku:

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

Tu użyłem p.o[:axes][1] == gca(). Trzeba ustawić top_margin=1cm, ponieważ obszar wykresu nie jest automatycznie dopasowywany (dla mojego aktualnego dostrojenia, to nie ma znaczenia).

Działa to również dla kolejnych aktualizacji, o ile używany jest tylko interfejs PyPlot. Na przykład, po następujących poleceń, fabuła będzie miał czerwoną prawą krawędź oprócz etykiet na górze:

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

Jednak, gdy stosuje się Plots komenda jak plot!(xlabel="foo"), wszystkie poprzednie zmiany dokonane z PyPlot są nadpisywane (co nie jest zaskakujące).

Pozostaje pytanie, w jaki sposób zaktualizować GUI interaktywnie, bez konieczności bezpośredniego dzwonienia pod numer PyPlot.savefig.

Odpowiedz

1

Nie - wykres jest obiektem działek, a nie obiektem PyPlot. W twoim konkretnym przykładzie możesz wykonać plot(sin, xmirror = true).

+0

Można jednak edytować obiekt wydruku bezpośrednio, korzystając z notacji wykresów. W tym przypadku 'p [1] [: xaxis] [: mirror] = true; wyświetlacz (p) '. 'display()' jest niezbędne dla każdej aktualizacji wykresu do pokazania. –

+0

Rozumiem, że 'p' jest obiektem' Plots', ale zdaje się owijać co najmniej częściowo funkcjonalny obiekt 'PyPlot' w' p.o', zobacz moje zaktualizowane pytanie na obejście tego problemu. Oczywiście, jeśli to możliwe, należy użyć interfejsu 'Plots', tak jak w tym przykładzie, ale czasami tylko wiem, jak wprowadzić konkretną zmianę w' PyPlot'. Dlatego też doceniłbym sposób na całkowite przekazanie kontroli do 'PyPlot' (przy użyciu backendu' pyplot') po tym, jak 90% wykresu zostanie wykonane w 'Plots'. – tim

+0

Bardzo imponujące hakowanie :-) –

1

Próbuję zrobić to samo, ale nie znalazłem rozwiązania, aby zaktualizować istniejący dział. Ale tutaj jest częściowa odpowiedź: można wyszukać informacje z osi PyPlot sprzeciw

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) 

i jest ona aktualizowana.

+0

Interesujące. BTW nie potrzebujesz wykresów przed PyPlot. –

+0

Ale byłbym bardzo zaskoczony, gdyby można go było użyć do zrobienia czegokolwiek, aby edytować fabułę. –

+0

I nie udało mi się edytować fabuły. Przejrzałem "Działki".kod źródłowy jl' na chwilę i po prostu nie mogłem się domyślić, dlaczego 'Działki' poprawnie aktualizują fabułę, ale dlaczego nie mogłem tego wymyślić. Myślę, że moje umiejętności julia nie są wystarczająco dobre, powinienem był użyć debuggera, aby zobaczyć, co tak naprawdę nazywa się. –

Powiązane problemy