Gnuplot gegen Matplotlib

83

Ich habe mit einem Projekt begonnen, das Tomcat- Protokolle mit gnuplot-py grafisch darstellt und insbesondere bestimmte Anforderungen mit der Speicherzuweisung und der Speicherbereinigung korreliert. Was ist die kollektive Weisheit über gnuplot-py vs Matplotlib für Python-Grafik. Gibt es bessere Grafikbibliotheken, von denen ich noch nichts gehört habe?

Meine allgemeinen Überlegungen sind:

  • Während gnuplot große Mengen an Dokumentation enthält, ist dies bei gnuplot-py nicht der Fall. Wie gut ist die Dokumentations-Community für Matplotlib?
  • Gibt es Dinge, die Gnuplot tun kann, Gnuplot-py jedoch nicht?
  • Hat Matplotlib eine bessere Python-Unterstützung?
  • Gibt es große Show-Stop-Bugs? Ärger?
  • Derzeit zeichnet gnuplot 100.000 Punkte auf. Ich plane, diese auf Millionen zu skalieren. Soll ich mit Problemen rechnen? Wie gut geht Matplotlib damit um?
  • Benutzerfreundlichkeit, Bearbeitungszeit für Gnuplot vs Matplotlib?
  • Wie einfach wäre es, vorhandenen Gnuplot-Py-Code nach Matplotlib zu portieren?

Wie würden Sie diese Aufgabe angehen?

Ethan Heilman
quelle
Ein weiterer Gnuplot-Wrapper ist gplot.py, der auch in jupyter funktioniert .
Friedrich

Antworten:

50
  • Sie können die Dokumentation von matplotlib selbst überprüfen . Ich finde es ziemlich umfassend.
  • Ich habe sehr wenig Erfahrung mit Gnuplot-Py, daher kann ich nicht sagen, ob es alles kann, was Gnuplot kann.
  • Matplotlib wurde speziell für Python geschrieben und entwickelt, daher passt es sehr gut zu Python-Redewendungen und dergleichen.
  • Matplotlib ist ein ausgereiftes Projekt. Die NASA benutzt es für einige Sachen.
  • Ich habe zig Millionen Punkte in Matplotlib aufgezeichnet, und es sah immer noch wunderschön aus und reagierte schnell.
  • Neben der objektorientierten Verwendung von Matplotlib gibt es die Pylab-Oberfläche, die das Plotten so einfach macht wie in MATLAB - das heißt, sehr einfach.
  • Was die Portierung von gnuplot-py nach matplotlib betrifft, habe ich keine Ahnung.
Autoplektisch
quelle
3
Das einzige Plus, das ich für Gnuplot sagen kann, ist, dass matplotlib keine 3D-Plotfunktionen hat. Außerdem habe ich bei weitem beide eine bevorzugte Matplotlib verwendet.
Physikmichael
1
@ vgm64: Die aktuelle SVN hat 3D wieder hinzugefügt. Ich habe selbst nichts davon getestet, daher kann ich nicht sagen, wie schön es ist. Für das 3D-Plotten verwende ich mayavi2: code.enthought.com/projects/mayavi .
Autoplektische
10
matplotlib hat jetzt ein 3D-Toolkit
Kit
9
"Matplotlib wurde speziell für Python geschrieben und entwickelt" - da muss ich nicht zustimmen. Die matplotlib-API ist so weit von "typischem Python" entfernt, dass es weh tut. Wenn überhaupt, ahmt es die Matlab-Semantik nach.
Ole
6
Voreingenommen. Sie hatten "sehr wenig Erfahrung mit Gnuplot-Py". Die angegebenen Informationen beziehen sich ausschließlich auf matplotlib. Der Ausdruck über Matplotlib ist ebenfalls zu subjektiv.
Tintenfisch
45

Matplotlib = Benutzerfreundlichkeit, Gnuplot = (etwas bessere) Leistung


Ich weiß, dass dieser Beitrag alt und beantwortet ist, aber ich ging vorbei und wollte meine zwei Cent setzen. Hier ist meine Schlussfolgerung: Wenn Sie einen nicht so großen Datensatz haben, sollten Sie Matplotlib verwenden. Es ist einfacher und sieht besser aus. Wenn Sie jedoch wirklich Leistung benötigen, können Sie Gnuplot verwenden. Ich habe Code hinzugefügt, um ihn auf Ihrem Computer zu testen und selbst zu sehen, ob er einen echten Unterschied macht (dies ist kein echter Leistungsmaßstab, sollte aber eine erste Idee geben).

Das folgende Diagramm zeigt die erforderliche Zeit (in Sekunden) für:

  • Zeichnen Sie ein zufälliges Streudiagramm
  • Speichern Sie das Diagramm in einer PNG-Datei

Gnuplot VS Matplotlib

Aufbau:

  • Gnuplot: 5.2.2
  • Gnuplot-py: 1,8
  • matplotlib: 2.1.2

Ich erinnere mich, dass die Leistungslücke auf einem älteren Computer mit älteren Versionen der Bibliotheken viel größer ist (~ 30 Sekunden Unterschied für ein großes Streudiagramm).

Darüber hinaus können Sie, wie in den Kommentaren erwähnt, eine gleichwertige Qualität der Diagramme erhalten. Aber Sie müssen mehr ins Schwitzen bringen, um es mit Gnuplot zu tun.


Hier ist der Code zum Generieren des Diagramms, wenn Sie es auf Ihrem Computer ausprobieren möchten:

# -*- 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()
7hibault
quelle
6
Darüber hinaus möchte ich hinzufügen, dass sie in Bezug auf die Qualität der Darstellung gleichwertig sind, wenn jemand nicht nur die Standardstile verwendet. Darüber hinaus kann Gnuplot einfach aufgerufen werden, ohne Python ausführen zu müssen , sodass es sprachunabhängig ist !
Atcold
22

matplotlibhat eine ziemlich gute Dokumentation und scheint ziemlich stabil zu sein. Die Handlungen, die es produziert, sind wunderschön - "Publikationsqualität" sicher. Aufgrund der guten Dokumentation und der Menge an online verfügbarem Beispielcode ist es einfach zu erlernen und zu verwenden, und ich glaube, Sie werden keine großen Probleme beim Übersetzen habengnuplot Code in diesen Code zu . Schließlich wird Matplotlib von Wissenschaftlern verwendet, um Daten zu zeichnen und Berichte zu erstellen - es enthält also alles, was man braucht.

Ein deutlicher Vorteil von matplotlib ist, dass Sie es in Python-GUIs ( mindestens wxPython und PyQt ) integrieren und eine GUI-Anwendung mit schönen Plots erstellen können.

Eli Bendersky
quelle
15

Nachdem ich GNUplot (mit meinem eigenen Python-Wrapper) für eine lange Zeit verwendet hatte (und die 80er-Jahre-Ausgabe wirklich nicht mochte), fing ich gerade an, mir matplotlib anzuschauen. Ich muss sagen, es gefällt mir sehr gut, die Ausgabe sieht wirklich gut aus und die Dokumente sind von hoher Qualität und umfangreich (obwohl das auch für GNUplot gilt). Das einzige, wonach ich in den matplotlib-Dokumenten lange gesucht habe, ist, wie man in eine Bilddatei schreibt und nicht auf den Bildschirm! Zum Glück erklärt diese Seite es ziemlich gut: http://www.dalkescientific.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html

Wim
quelle
10
Ich habe über die 80er aussehende Ausgang anderer Meinung zu sein gnuplot (was geschrieben ist gnuplot und nicht GPUplot ). Wenn Sie einige benutzerdefinierte Stile verwenden (Sie müssen sie nur einmal definieren), erhalten Sie eine schöne Darstellung. Schauen Sie sich einfach an, wie andere diese erstaunliche Software verwendet haben ( Referenz ).
Atcold
8

Ich habe mit beiden gespielt und ich mag Matplotlib viel besser in Bezug auf Python-Integration, Optionen und Qualität von Grafiken / Plots.

Corey Goldberg
quelle
6

Informationen zur Leistung und zum Zeichnen einer großen Anzahl von Punkten: Ich habe dies mit einem Streudiagramm von 500.000 Punkten verglichen, das aus einer Textdatei geladen und mit gnuplot * und matplotlib in einem PNG gespeichert wurde.

500.000 points scatterplot
gnuplot:      5.171 s
matplotlib: 230.693 s

Ich habe es nur einmal ausgeführt und die Ergebnisse sehen nicht identisch aus, aber ich denke, die Idee ist klar: Gnuplot gewinnt bei der Leistung.

* Ich habe gnuplot direkt verwendet, da die gnuplotpy-Demo für mich nicht sofort funktioniert. Matplotlib gewinnt bei der Python-Integration.

Kennzeichen
quelle
4

Was Gnuplot kann Gnuplot-Py kann auch. Weil Gnuplot per Pipe (pgnuplot) gefahren werden kann. Gnuplot-Py ist nur eine dünne Schicht dafür. Sie brauchen sich also keine Sorgen zu machen.

Warum ich Gnuplot bevorzuge, sind vielleicht die vielen Ausgabeformate (PDF, PS und LaTex), die in Papieren sehr nützlich sind, und die Standardausgabe sieht eher wissenschaftlich aus :)

joseph.smeng
quelle
2

Einige Profis von gnuplot(Ich mag Matlibplot nach Jahren des Gebrauchs immer noch nicht):

  • Plot - Funktion einfach mitsin(x) (keine Notwendigkeit Arrays zu definieren und über Bereiche denken)
  • Plot - Dateien direkt (kein Import in ein Array erforderlich)
  • Plotten Sie Piped-Daten (führen Sie Shell-Befehle im laufenden Betrieb aus "<echo 1 2 3" )
  • Schaltfläche zum Kopieren in die Zwischenablage
  • schnelleres Plotten
  • schnellere Codierung

gplot.py ist ein weiterer Wrapper-Gnuplot-Wrapper für Python und Jupyter.

Friedrich
quelle