gnuplot vs Matplotlib
Zacząłem projekt graficzny Tomcat logów za pomocą gnuplot-py , specjalnie skorelowanie poszczególnych żądań z alokacją pamięci i garbage collection. Co to jest wiedza zbiorowa na temat gnuplot-py vs Matplotlib do tworzenia wykresów w Pythonie. Czy są tam lepsze biblioteki graficzne, o których nie słyszałem?
Moje ogólne rozważania to:
- podczas gdy gnuplot ma duże ilości dokumentacji, gnuplot-py nie. jak dobra jest dokumentacja społeczność 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 obu są wielkie show zatrzymujące robaki? Irytacja? Obecnie gnuplot wykreśla 100.000 punktów, planuję przeskalować to do milionów. Czy powinienem spodziewać się problemów? Jak dobrze Matplotlib sobie z tym radzi?
- łatwość obsługi, czas realizacji gnuplot vs Matplotlib?
- Jak łatwo byłoby być do portowania istniejącego kodu gnuplot-py do Matplotlib?
Jak byś podszedł do tego zadania?
7 answers
- możesz sprawdzić dokumentację matplotliba . Uważam to za dość obszerne.
- mam bardzo małe doświadczenie z gnuplot-py, więc nie mogę powiedzieć, czy może to zrobić wszystko gnuplot może.
- Matplotlib jest napisany i zaprojektowany specjalnie dla Pythona, więc bardzo dobrze pasuje do idiomów Pythona i tym podobnych.
- Matplotlib jest dojrzałym projektem. NASA używa go do pewnych rzeczy.
- wykreśliłem dziesiątki milionów punktów w Matplotlibie i nadal wyglądało piękne i szybko zareagowały.
- poza obiektowym sposobem korzystania z Matplotlib jest interfejs pylab, który sprawia, że kreślenie jest tak proste, jak w Matlabie-czyli bardzo proste. Jeśli chodzi o portowanie z gnuplot-py na matplotlib, to nie mam pojęcia.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-30 09:03:55
Matplotlib = łatwość obsługi, Gnuplot = (nieco lepsza) wydajność
Wiem, że ten post jest stary i odpowiedział, ale przechodziłem i chciałem umieścić moje dwa grosze. Oto mój wniosek: jeśli masz niezbyt duży zestaw danych, powinieneś użyć Matplotlib. Jest łatwiej i wygląda lepiej. Jeśli jednak naprawdę potrzebujesz wydajności, możesz użyć Gnuplot. Dodałem trochę kodu, aby przetestować go na komputerze i zobaczyć na własne oczy, czy robi to prawdziwą różnicę (to nie jest prawdziwy benchmark wydajności, ale powinien dać pierwszy pomysł).
Poniższy wykres przedstawia wymagany czas (w sekundach) do:
- narysuj losowy wykres punktowy
- Zapisz wykres do pliku png
Konfiguracja:
- gnuplot: 5.2.2
- gnuplot-py: 1.8
- matplotlib: 2.1.2
Pamiętam, że luka w wydajności była znacznie większa podczas pracy na starszym komputerze ze starszymi wersjami bibliotek (Różnica~30 sekund dla dużego wykresu punktowego).
Ponadto, jak wspomniano w komentarzach, można uzyskać równoważną jakość działek. Ale będziesz musiał włożyć w to więcej potu, aby to zrobić z Gnuplot.
Oto kod do wygenerowania wykresu, jeśli chcesz wypróbować go na swojej maszynie:
# -*- 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()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-22 10:26:23
matplotlib
ma całkiem dobrą dokumentację i wydaje się być dość stabilny. Działki, które produkuje są piękne - "jakość publikacji" na pewno. Ze względu na dobrą dokumentację i ilość przykładowego kodu dostępnego online, jest on łatwy do nauczenia się i użycia, I nie sądzę, że będziesz miał duże problemy z tłumaczeniem gnuplot
kodu do niego. Wszakĺľe matplotlib jest uĺľywany przez naukowcăłw do wykreĺ " lania danych i przygotowywania raportăłw-wiÄ ™ c zawiera wszystko, czego siÄ ™ potrzebuje.
Jedną z zalet matplotlib jest że można zintegrować go z GUI Pythona (wxPython i PyQt, co najmniej) i stworzyć aplikację GUI z ładnymi wykresami.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-26 17:15:32
Po długim używaniu GNUplot (z własnym opakowaniem Pythona) (i naprawdę nie podoba mi się wyjście z lat 80-tych), po prostu zacząłem przeglądać matplotlib. Muszę powiedzieć, że bardzo mi się podoba, wyjście wygląda naprawdę ładnie, a dokumenty są wysokiej jakości i obszerne (choć dotyczy to również GNUplot). Jedyną rzeczą, którą spędziłem wieki szukając 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-25 10:01:31
Grałem z obydwoma, a Matplotlib znacznie bardziej podoba mi się pod względem integracji Pythona, opcji i jakości wykresów/wykresów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-26 17:15:51
Co potrafi Gnuplot Gnuplot-Py też potrafi. Ponieważ Gnuplot może być napędzany przez rurę (pgnuplot). Gnuplot-Py jest dla niego tylko cienką warstwą. Więc nie musisz się o to martwić.
Dlaczego wolę gnuplot może wiele formatów wyjściowych (PDF, PS i LaTex), Co jest bardzo przydatne w dokumentach, a domyślne wyjście wygląda bardziej naukowy Styl :)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-02 14:29:39
O wydajności i wykreśleniu dużej liczby punktów: porównałem to dla punktu rozproszonego 500.000 punktów załadowanych z pliku tekstowego i zapisanych do png, używając 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 pomysł jest jasny: gnuplot wygrywa w wydajności.
* używałem gnuplot bezpośrednio, ponieważ demo gnuplotpy nie działa po wyjęciu z pudełka. Matplotlib wygrywa w integracji Pythona.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-10 21:26:25