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?

Author: Peter Mortensen, 2009-05-26

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.
 48
Author: Autoplectic,
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

Gnuplot VS Matplotlib

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()
 36
Author: 7hibault,
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.

 21
Author: Eli Bendersky,
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

 15
Author: Wim,
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.

 8
Author: Corey Goldberg,
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 :)

 4
Author: joseph.smeng,
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.

 3
Author: Mark,
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