Zacząłem od projektu graficznego dla logów Tomcat przy użyciu gnuplot-py , w szczególności korelując poszczególne żądania z alokacją pamięci i czyszczeniem pamięci. Jaka jest zbiorowa mądrość na temat gnuplot-py vs Matplotlib for Python graphing. Czy istnieją lepsze biblioteki graficzne, o których nie słyszałem?
Moje ogólne uwagi są następujące:
- Podczas gdy gnuplot ma dużą ilość dokumentacji, gnuplot-py nie. Jak dobra jest społeczność dokumentacji dla Matplotlib?
- Czy są rzeczy, które gnuplot może zrobić, ale gnuplot-py nie może?
- Czy Matplotlib ma lepszą obsługę Pythona?
- Czy w którymś z nich są duże programy zatrzymujące błędy? Irytacje?
- Obecnie gnuplot tworzy wykresy 100 000 punktów, planuję zwiększyć to do milionów. Czy powinienem spodziewać się problemów? Jak dobrze radzi sobie z tym Matplotlib?
- Łatwość obsługi, czas realizacji dla gnuplot vs Matplotlib?
- Jak łatwo byłoby przenieść istniejący kod gnuplot-py do Matplotlib?
Jak podszedłbyś do tego zadania?
Odpowiedzi:
źródło
Matplotlib = łatwość użycia, Gnuplot = (nieco lepsza) wydajność
Wiem, że ten post jest stary i odpowiedziałem, ale przechodziłem obok i chciałem włożyć swoje dwa centy. Oto mój wniosek: jeśli masz niezbyt duży zestaw danych, powinieneś użyć Matplotlib. Jest łatwiejsze i lepiej wygląda. Jeśli jednak naprawdę potrzebujesz wydajności, możesz użyć Gnuplot. Dodałem trochę kodu, aby przetestować go na twoim komputerze i przekonać się, czy robi to prawdziwą różnicę (nie jest to prawdziwy test wydajności, ale powinien dać pierwszy pomysł).
Poniższy wykres przedstawia wymagany czas (w sekundach) do:
Konfiguracja:
Pamiętam, że różnica w wydajności jest znacznie większa podczas pracy na starszym komputerze ze starszymi wersjami bibliotek (różnica ~ 30 sekund w przypadku dużego wykresu punktowego).
Ponadto, jak wspomniano w komentarzach, można uzyskać podobną jakość działek. Ale będziesz musiał włożyć więcej potu, aby zrobić to z Gnuplot.
Oto kod do wygenerowania wykresu, jeśli chcesz wypróbować go na swoim komputerze:
# -*- coding: utf-8 -*- from timeit import default_timer as timer import matplotlib.pyplot as plt import Gnuplot, Gnuplot.funcutils import numpy as np import sys import os def mPlotAndSave(x, y): plt.scatter(x, y) plt.savefig('mtmp.png') plt.clf() def gPlotAndSave(data, g): g("set output 'gtmp.png'") g.plot(data) g("clear") def cleanup(): try: os.remove('gtmp.png') except OSError: pass try: os.remove('mtmp.png') except OSError: pass begin = 2 end = 500000 step = 10000 numberOfPoints = range(begin, end, step) n = len(numberOfPoints) gnuplotTime = [] matplotlibTime = [] progressBarWidth = 30 # Init Gnuplot g = Gnuplot.Gnuplot() g("set terminal png size 640,480") # Init matplotlib to avoid a peak in the beginning plt.clf() for idx, val in enumerate(numberOfPoints): # Print a nice progress bar (crucial) sys.stdout.write('\r') progress = (idx+1)*progressBarWidth/n bar = "▕" + "▇"*progress + "▁"*(progressBarWidth-progress) + "▏" + str(idx) + "/" + str(n-1) sys.stdout.write(bar) sys.stdout.flush() # Generate random data x = np.random.randint(sys.maxint, size=val) y = np.random.randint(sys.maxint, size=val) gdata = zip(x,y) # Generate string call to a matplotlib plot and save, call it and save execution time start = timer() mPlotAndSave(x, y) end = timer() matplotlibTime.append(end - start) # Generate string call to a gnuplot plot and save, call it and save execution time start = timer() gPlotAndSave(gdata, g) end = timer() gnuplotTime.append(end - start) # Clean up the files cleanup() del g sys.stdout.write('\n') plt.plot(numberOfPoints, gnuplotTime, label="gnuplot") plt.plot(numberOfPoints, matplotlibTime, label="matplotlib") plt.legend(loc='upper right') plt.xlabel('Number of points in the scatter graph') plt.ylabel('Execution time (s)') plt.savefig('execution.png') plt.show()
źródło
matplotlib
ma całkiem dobrą dokumentację i wydaje się być całkiem stabilny. Działki, które produkuje są piękne - na pewno „jakość wydawnicza”. Ze względu na dobrą dokumentację i ilość przykładowego kodu dostępnego online, jest łatwy do nauczenia i używania, i nie sądzę, żebyś miał dużo problemów z przetłumaczeniemgnuplot
na niego kodu. W końcu matplotlib jest używany przez naukowców do wykreślania danych i przygotowywania raportów - więc zawiera wszystko, czego potrzeba.Jedną z istotnych zalet matplotlib jest to, że można go zintegrować z interfejsami GUI Pythona ( przynajmniej wxPython i PyQt ) i tworzyć aplikacje GUI z ładnymi wykresami.
źródło
Po długim używaniu GNUplot (z moim własnym opakowaniem Pythona) (i naprawdę nie lubię wyjścia wyglądającego na lata 80.), właśnie zacząłem przyglądać się matplotlib. Muszę powiedzieć, że bardzo mi się podoba, wynik wygląda naprawdę ładnie, a dokumentacja jest wysokiej jakości i obszerna (chociaż dotyczy to również GNUplot). Jedyną rzeczą, której szukałem od lat w dokumentach matplotlib, jest to, jak pisać do pliku obrazu, a nie do ekranu! Na szczęście ta strona wyjaśnia to całkiem dobrze: http://www.dalkescientific.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html
źródło
Bawiłem się obydwoma i znacznie bardziej podoba mi się Matplotlib pod względem integracji z Pythonem, opcji i jakości wykresów / wykresów.
źródło
O wydajności i wykreślaniu dużej liczby punktów: porównałem to z wykresem rozrzutu zawierającym 500 000 punktów załadowanym z pliku tekstowego i zapisanym w formacie png przy użyciu gnuplot * i matplotlib.
500.000 points scatterplot gnuplot: 5.171 s matplotlib: 230.693 s
Uruchomiłem go tylko raz i wyniki nie wyglądają identycznie, ale myślę, że idea jest jasna: gnuplot wygrywa na wydajności.
* Użyłem gnuplot bezpośrednio, ponieważ demo gnuplotpy nie działa dla mnie od razu po wyjęciu z pudełka. Matplotlib wygrywa w integracji z Pythonem.
źródło
Co potrafi Gnuplot Gnuplot-Py też potrafi. Ponieważ Gnuplot może być sterowany przez potok (pgnuplot). Gnuplot-Py to po prostu cienka warstwa. Więc nie musisz się tym martwić.
Dlaczego wolę gnuplot, może wiele formatów wyjściowych (PDF, PS i LaTex), co jest bardzo przydatne w artykułach, a domyślny wynik wygląda bardziej naukowo :)
źródło
Niektóre pro
gnuplot
(nadal nie lubię matlibplot po latach użytkowania):sin(x)
(nie ma potrzeby definiowania tablic i myślenia o zakresach)"<echo 1 2 3"
)gplot.py to kolejny wrapper gnuplot wrapper dla Pythona i Jupytera.
źródło