Byłaby to świetna funkcja, ale AFAIK nie jest zaimplementowana w Matplotlib i prawdopodobnie byłaby trudna do zaimplementowania samodzielnie ze względu na sposób przechowywania liczb.
Sugerowałbym albo (a) oddzielne przetwarzanie danych od generowania figury (która zapisuje dane pod unikalną nazwą) i napisanie skryptu generującego figurę (ładowanie określonego pliku zapisanych danych) i edycję według własnego uznania lub (b ) zapisz jako format PDF / SVG / PostScript i edytuj w jakimś wymyślnym edytorze figur, takim jak Adobe Illustrator (lub Inkscape ).
EDYTUJ po jesieni 2012 : Jak inni zauważyli poniżej (choć wspominali tutaj, ponieważ jest to akceptowana odpowiedź), Matplotlib od wersji 1.2 pozwalał na trawienie liczb. Zgodnie z informacją o wydaniu jest to funkcja eksperymentalna i nie obsługuje zapisywania figury w jednej wersji matplotlib i otwierania w innej. Przywracanie marynaty z niezaufanego źródła jest również ogólnie niebezpieczne.
W przypadku udostępniania / późniejszej edycji wykresów (które najpierw wymagają znacznego przetworzenia danych i mogą wymagać poprawek po miesiącach, np. Podczas recenzowania publikacji naukowych), nadal zalecam przepływ pracy (1), aby mieć skrypt przetwarzania danych, który przed wygenerowaniem wykresu zapisuje przetworzone dane (które trafiają do twojego wykresu) do pliku i (2) ma osobny skrypt generujący wykres (który możesz dostosować w razie potrzeby), aby odtworzyć wykres. W ten sposób dla każdego wykresu można szybko uruchomić skrypt i ponownie go wygenerować (i szybko skopiować ustawienia wykresu z nowymi danymi). To powiedziawszy, wytrawianie figury może być wygodne do krótkoterminowej / interaktywnej / eksploracyjnej analizy danych.
pickle
teraz działa na figurach MPL, więc można to zrobić i wygląda na to, że działa całkiem nieźle - prawie jak plik figury Matlab ".fig". Zobacz moją odpowiedź poniżej (na razie?), Aby zobaczyć przykład, jak to zrobić.Właśnie dowiedziałem się, jak to zrobić. „Eksperymentalna obsługa marynat”, o której wspomniał @pelson, działa całkiem dobrze.
Spróbuj tego:
Po dostosowaniu interaktywnych zapisz obiekt figury jako plik binarny:
Później otwórz rysunek, a poprawki powinny zostać zapisane, a interaktywność GUI powinna być obecna:
Możesz nawet wyodrębnić dane z wykresów:
(Działa dla linii, pcolor i imshow - pcolormesh wykorzystuje kilka sztuczek do rekonstrukcji spłaszczonych danych .)
Otrzymałem doskonałą wskazówkę od zapisywania danych Matplotlib za pomocą marynaty .
źródło
pickle
dokumentacja mówi, że musimy skonfigurować środowisko podobnie jak wtedy, gdy obiekt był marynowany (zapisywany), ale stwierdziłem, że nie trzeba tego robićimport matplotlib.pyplot as plt
podczas rozpakowywania (ładowania) - zapisuje instrukcje importu w piklowanym pliku .with open('FigureObject.fig.pickle', 'rb') as file: figx = pickle.load(file)
figx.show()
, powinieneś zadzwonićplt.show()
zamiast tego, co jest blokowaniem.Począwszy od Matplotlib 1.2, mamy teraz eksperymentalną obsługę pikle . Spróbuj i zobacz, czy działa dobrze w Twoim przypadku. Jeśli masz jakiekolwiek problemy, daj nam znać na liście mailingowej Matplotlib lub otwierając problem na github.com/matplotlib/matplotlib .
źródło
PicklingError: Can't pickle <type '_macosx.GraphicsContext'>: it's not found as _macosx.GraphicsContext
.PicklingError
ma miejsce tylko wtedy, gdyplt.show()
sprawdzisz przed marynowaniem. Więc po prostu umieśćplt.show()
popickle.dump()
.fig.show()
nie wydaje się mieć znaczenia - być może ten błąd został naprawiony. Mogę marynować przed / poshow()
bez problemu.Dlaczego po prostu nie wysłać skryptu w języku Python? Pliki .fig MATLAB-a wymagają od odbiorcy posiadania MATLAB-a, aby je wyświetlić, więc jest to prawie równoważne wysłaniu skryptu Pythona, który wymaga wyświetlenia Matplotlib.
Alternatywnie (zastrzeżenie: jeszcze tego nie próbowałem) możesz spróbować wytrawić figurę:
źródło
MyPlot.fig.pickle
plik - zachowując później możliwość dostosowania prezentacji wykresu według potrzeb. To również jest świetne w.fig
plikach Matlaba . Szczególnie przydatne, gdy trzeba zmienić rozmiar / proporcje figury (do umieszczenia w prezentacjach / artykułach).Dobre pytanie. Oto tekst dokumentu z
pylab.save
:źródło
pylab.save
. W rzeczywistości z tekstu dokumentu wynika, że nie należy go używać.Wymyśliłem stosunkowo prosty (ale nieco niekonwencjonalny) sposób zapisywania moich danych matplotlib. Działa to tak:
z funkcją
save_plot
zdefiniowaną w ten sposób (prosta wersja do zrozumienia logiki):lub definiując
save_plot
taką funkcję (lepsza wersja wykorzystująca kompresję zip do tworzenia lżejszych plików z figurami):To sprawia, że używam
libscript
własnego modułu , który w większości opiera się na modułachinspect
iast
. Mogę spróbować udostępnić to na Githubie, jeśli wyrażone zostanie zainteresowanie (najpierw wymagałoby to uporządkowania i rozpoczęcia korzystania z Github).Ideą tej
save_plot
funkcji ilibscript
modułu jest pobranie instrukcji Pythona, które tworzą figurę (za pomocą modułuinspect
), przeanalizowanie ich (za pomocą modułuast
) w celu wyodrębnienia wszystkich zmiennych, funkcji i modułów, na których opiera się, wyodrębnienie ich z kontekstu wykonania i ich serializacja jako instrukcje Pythona (kod dla zmiennych będzie podobny dot=[0.0,2.0,0.01]
... a kod modułów będzie podobny doimport matplotlib.pyplot as plt
...) dołączone do instrukcji rysunku. Wynikowe instrukcje w języku Python są zapisywane jako skrypt w języku Python, którego wykonanie spowoduje odtworzenie oryginalnej figury matplotlib.Jak możesz sobie wyobrazić, działa to dobrze w przypadku większości (jeśli nie wszystkich) figur matplotlib.
źródło