93 Stimmen

gnuplot vs. Matplotlib

Ich habe mit einem Projekt zur grafischen Darstellung Tomcat Protokolle mit gnuplot-py und zwar durch die Verknüpfung bestimmter Anfragen mit der Speicherzuweisung und der Garbage Collection. Was ist die kollektive Weisheit über gnuplot-py vs. Matplotlib für Python-Grafiken. Gibt es bessere Graphing-Bibliotheken da draußen, die ich nicht gehört habe?

Meine allgemeinen Überlegungen sind:

  • Während gnuplot über eine umfangreiche Dokumentation verfügt, ist dies bei gnuplot-py nicht der Fall. Wie gut ist die Dokumentationsgemeinschaft für Matplotlib?
  • Gibt es Dinge, die gnuplot tun kann, aber gnuplot-py nicht?
  • Hat Matplotlib eine bessere Python-Unterstützung?
  • Gibt es große, auffällige Fehler in beiden? Ärgernisse?
  • Zurzeit stellt gnuplot 100.000 Punkte dar, ich plane eine Skalierung auf Millionen von Punkten. Sollte ich Probleme erwarten? Wie gut beherrscht Matplotlib dies?
  • Benutzerfreundlichkeit, Durchlaufzeit für gnuplot vs Matplotlib?
  • Wie einfach wäre es, bestehenden gnuplot-py-Code auf Matplotlib zu portieren?

Wie würden Sie diese Aufgabe angehen?

54voto

Autoplectic Punkte 7468
  • Sie können prüfen matplotlibs Dokumentation selbst. Ich finde sie recht umfassend.
  • Ich habe sehr wenig Erfahrung mit gnuplot-py, daher kann ich nicht sagen, ob es alles kann, was gnuplot kann.
  • Matplotlib ist in Python geschrieben und wurde speziell für Python entwickelt, so dass es sehr gut zu den Python-Idiomen und dergleichen passt.
  • Matplotlib ist ein ausgereiftes Projekt. Die NASA verwendet es für einige Dinge.
  • Ich habe Dutzende von Millionen von Punkten in Matplotlib geplottet, und es sah immer noch schön aus und reagierte schnell.
  • Neben der objektorientierten Verwendung von Matplotlib gibt es die pylab-Schnittstelle, die das Plotten genauso einfach macht wie in MATLAB - nämlich sehr einfach.
  • Wie für die Portierung von gnuplot-py zu matplotlib, ich habe keine Ahnung.

50voto

7hibault Punkte 2183

Matplotlib = Benutzerfreundlichkeit, Gnuplot = (etwas bessere) Leistung


Ich weiß, dass dieser Beitrag alt ist und bereits beantwortet wurde, aber ich bin vorbeigekommen und wollte meinen Senf dazugeben. 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 etwas Code hinzugefügt, mit dem Sie es auf Ihrem Rechner testen und selbst sehen können, ob es einen wirklichen Unterschied macht (dies ist kein echter Leistungsvergleich, sollte aber einen ersten Eindruck vermitteln).

Das folgende Diagramm zeigt die benötigte Zeit (in Sekunden), um:

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

Gnuplot VS Matplotlib

Konfiguration:

  • gnuplot: 5.2.2
  • gnuplot-py: 1.8
  • matplotlib: 2.1.2

Ich erinnere mich, dass der Leistungsunterschied auf einem älteren Computer mit älteren Versionen der Bibliotheken viel größer war (~30 Sekunden Unterschied bei einem großen Streudiagramm).

Außerdem können Sie, wie in den Kommentaren erwähnt, eine gleichwertige Qualität der Grundstücke erhalten. Allerdings muss man dafür mehr Schweiß aufwenden, um es mit Gnuplot zu schaffen.


Hier ist der Code zur Erstellung des Diagramms wenn Sie es auf Ihrem Rechner 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()

26voto

Eli Bendersky Punkte 246100

matplotlib hat eine recht gute Dokumentation und scheint recht stabil zu sein. Die Plots, die es erzeugt, sind wunderschön - "Publikationsqualität" ist sicher. Aufgrund der guten Dokumentation und der Menge an online verfügbarem Beispielcode ist es leicht zu erlernen und zu benutzen, und ich glaube nicht, dass Sie große Schwierigkeiten beim Übersetzen haben werden gnuplot Code zu. Schließlich wird matplotlib von Wissenschaftlern verwendet, um Daten zu plotten und Berichte zu erstellen - es enthält also alles, was man braucht.

Ein großer Vorteil von matplotlib ist, dass man es in Python-GUIs integrieren kann ( wxPython et PyQt zumindest) und erstellen Sie eine GUI-Anwendung mit schönen Diagrammen.

18voto

Wim Punkte 10783

Nachdem ich GNUplot (mit meinem eigenen Python-Wrapper) lange Zeit benutzt habe (und die 80er-Jahre-Ausgabe nicht wirklich mochte), habe ich gerade angefangen, einen Blick auf matplotlib zu werfen. Ich muss sagen, es gefällt mir sehr gut, die Ausgabe sieht wirklich schön aus und die Dokumentation ist hochwertig und umfangreich (obwohl das auch für GNUplot gilt). Das einzige, wonach ich ewig in den matplotlib-Dokumenten gesucht habe, ist die Frage, wie man in eine Bilddatei schreibt und nicht auf den Bildschirm! Glücklicherweise erklärt diese Seite das ziemlich gut: http://www.dalkescientific.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html

10voto

Mark Punkte 16672

Über die Leistung und das Plotten einer großen Anzahl von Punkten: Ich habe dies für ein Streudiagramm mit 500.000 Punkten verglichen, das aus einer Textdatei geladen und in einem png-Format gespeichert wurde, wobei gnuplot* und matplotlib verwendet wurden.

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 an Leistung.

*Ich habe gnuplot direkt verwendet, da die gnuplotpy-Demo bei mir nicht out-of-the-box funktioniert. Matplotlib gewinnt bei der Python-Integration.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X