Frage

Ich habe an einem Projekt Grafik Tomcat meldet sich mit gnuplot-py , und zwar insbesondere Anfragen mit Speicherzuweisung und die Garbage collection zu korrelieren. Was ist der kollektive Weisheit auf gnuplot-py vs Matplotlib für Python grafische Darstellung. Gibt es eine bessere Grafik-Bibliotheken da draußen habe ich nicht gehört?

Meine allgemeinen Überlegungen sind:

  • Während gnuplot große Mengen an Dokumentation hat, gnuplot-py nicht. Wie gut ist die Dokumentation Community für Matplotlib?
  • Gibt es Dinge, die gnuplot tun können, aber gnuplot-py nicht?
  • Ist Matplotlib haben eine bessere Python-Unterstützung?
  • Gibt es große Show Anhalten Fehler in entweder sind? Ärgernisse?
  • Derzeit gnuplot 100.000 's von Punkten grafische Darstellung, ich plane, diese auf der Skalierung auf Millionen auf. Sollte ich erwarten Probleme? Wie gut funktioniert Matplotlib damit umgehen?
  • Einfache Bedienung, Durchlaufzeit für gnuplot vs Matplotlib?
  • Wie leicht zu portieren bestehende gnuplot-py Code wäre zu matplotlib?

Wie werden Sie diese Aufgabe angehen?

War es hilfreich?

Lösung

  • Sie können überprüfen, matplotlib Dokumentation selbst. Ich finde es ziemlich umfangreich.
  • Ich habe sehr wenig Erfahrung mit gnuplot-py, also kann ich nicht sagen, ob sie alle gnuplot können tun können.
  • Matplotlib geschrieben in und speziell für Python entwickelt, so dass es passt sehr gut mit Python Idiome und so weiter.
  • Matplotlib ist ein ausgereiftes Projekt. NASA nutzt es für ein paar Sachen.
  • Ich habe zig Millionen von Punkten in Matplotlib aufgetragen, und es sah immer noch schön und schnell reagiert.
  • über die objektorientierte Art und Weise Matplotlib der Verwendung ist die pylab-Schnittstelle, die so einfach macht, wie es ist in MATLAB Plotten - das ist, sehr einfach
  • .
  • Wie für die Portierung von gnuplot-py zu matplotlib, ich habe keine Ahnung.

Andere Tipps

Matplotlib = einfache Bedienung, Gnuplot = (etwas besser) Leistung


Ich weiß, dass dieser Beitrag ist alt und beantwortet, aber ich kam vorbei und wollte meine zwei Cent setzen. Hier ist meine Schlussfolgerung: Wenn Sie eine nicht-so-große Datenmenge 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 einige Code hinzugefügt, um es auf Ihrem System zu testen und für sich selbst sehen, ob es einen wirklichen Unterschied macht (dies ist keine echte Performance-Benchmark, sollte aber eine erste Idee geben).

Das folgende Diagramm stellt die erforderliche Zeit (in Sekunden):

  • Plot eine zufällige Streudiagramm
  • Speichern Sie die Grafik in einer PNG-Datei

Gnuplot VS Matplotlib

Konfiguration:

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

Ich erinnere mich an die Leistungslücke viel breiter ist, wenn sie auf einem älteren Computer mit älteren Versionen der Bibliotheken (~ 30 Sekunden Differenz für eine große Streudiagramm) ausgeführt wird.

Außerdem ist, wie in den Kommentaren erwähnt, können Sie gleichwertige Qualität der Parzellen erhalten. Aber Sie müssen mehr Schweiß in das setzen sie mit Gnuplot zu tun.


Hier ist der Code, um die grafische Darstellung zu erzeugen, wenn Sie es versuchen auf Ihrem Rechner geben wollen :

# -*- 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()

matplotlib hat ziemlich gute Dokumentation und scheint recht stabil zu sein. Die Parzellen es produziert sind schön - „Publikationsqualität“ sicher. Aufgrund der guten Dokumentation und die Menge der verfügbaren Online-Beispiel-Code, ist es einfach zu erlernen und zu benutzen, und ich glaube nicht, dass Sie viel Mühe übersetzt gnuplot Code zu ihm haben werden. Schließlich wird matplotlib von Wissenschaftlern verwendet wird, um Daten zu plotten und Berichte erstellen -. So enthält es alles, was man braucht

Ein deutlicher Vorteil von matplotlib ist, dass man es mit Python GUIs ( wxPython und PyQt zumindest) und GUI-Anwendung mit schönen Plots erstellen.

Nach der Verwendung von GNUplot (mit meinem eigenen Python-Wrapper) für eine lange Zeit (und wirklich nicht zu mögen den 80er aussehende Ausgang), begann ich nur einen Blick auf matplotlib haben. Ich muss sagen, Ich mag es sehr, die Ausgabe sieht wirklich nett und die Dokumentation sind hohe Qualität und umfassende (obwohl das auch für GNUplot geht). Das einzige, was ich habe Alter in dem matplotlib docs suchen ist, wie man eine Bilddatei zu schreiben, anstatt auf den Bildschirm! Glücklicherweise ist diese Seite erklärt es ziemlich gut: http: // www .dalkescientific.com / Schriften / Tagebuch / Archiv / 2005/04/23 / matplotlib_without_gui.html

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

Was Gnuplot kann tun Gnuplot-Py zu tun. Da Gnuplot kann durch Leitung (pgnuplot) angetrieben werden. Gnuplot-Py ist nur eine dünne Schicht für sie. So brauchen Sie sich keine Sorgen darüber.

Warum ziehe ich vielleicht das viel Ausgabeformat (PDF, PS und LaTeX) gnuplot, die in Papieren sehr nützlich ist, und die Standard-Ausgabe sieht wissenschaftlichere-style:)

über Leistung und eine große Anzahl von Punkten aufgetragen. Ich vergleichen dies für einen Scatterplot von 500.000 Punkten aus einer Textdatei geladen und zu einem png gespeichert, unter Verwendung von gnuplot * und matplotlib

500.000 points scatterplot
gnuplot:      5.171 s
matplotlib: 230.693 s

ich es lief nur einmal und die Ergebnisse sehen nicht identisch, aber ich denke, die Idee ist klar:. Gnuplot an Leistung gewinnt

* I verwendet gnuplot direkt, da die gnuplotpy Demo nicht funktioniert out-of-the-box für mich. Matplotlib gewinnt bei Python-Integration.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top