gnuplot contro Matplotlib


84

Ho iniziato un progetto che rappresenta graficamente i log di Tomcat utilizzando gnuplot-py , correlando in modo specifico richieste particolari con l'allocazione della memoria e la garbage collection. Qual è la saggezza collettiva su gnuplot-py vs Matplotlib per la rappresentazione grafica di Python. Esistono librerie grafiche migliori di cui non ho sentito parlare?

Le mie considerazioni generali sono:

  • Sebbene gnuplot abbia una grande quantità di documentazione, gnuplot-py no. Quanto è buona la comunità della documentazione per Matplotlib?
  • Ci sono cose che gnuplot può fare, ma gnuplot-py no?
  • Matplotlib ha un supporto migliore per Python?
  • Ci sono grandi spettacoli che bloccano i bug in entrambi? Fastidi?
  • Attualmente gnuplot sta rappresentando graficamente 100.000 punti, ho intenzione di scalarlo fino a milioni. Devo aspettarmi problemi? In che modo Matplotlib gestisce questo?
  • Facilità d'uso, tempi di consegna per gnuplot vs Matplotlib?
  • Quanto sarebbe facile portare il codice gnuplot-py esistente su Matplotlib?

Come affronteresti questo compito?


Un altro wrapper di gnuplot è gplot.py che funziona anche in jupyter .
Friedrich

Risposte:


51
  • Puoi controllare tu stesso la documentazione di matplotlib . Lo trovo abbastanza completo.
  • Ho poca esperienza con gnuplot-py, quindi non posso dire se può fare tutto ciò che gnuplot può fare.
  • Matplotlib è scritto e progettato specificamente per Python, quindi si adatta molto bene agli idiomi Python e simili.
  • Matplotlib è un progetto maturo. La NASA lo usa per alcune cose.
  • Ho tracciato decine di milioni di punti in Matplotlib, sembrava ancora bello e ha risposto rapidamente.
  • Al di là del modo orientato agli oggetti di usare Matplotlib c'è l'interfaccia pylab, che rende la stampa facile come in MATLAB, cioè molto semplice.
  • Per quanto riguarda il porting da gnuplot-py a matplotlib, non ne ho idea.

3
L'unico vantaggio che posso dire per gnuplot è che matplotlib non ha capacità di plottaggio 3D. Oltre a ciò, ho usato di gran lunga sia un matplotlib preferito.
physicsmichael

1
@ vgm64: l'attuale SVN ha aggiunto di nuovo il 3d. Non ne ho testato nessuno, quindi non posso dire quanto sia bello. per la stampa 3D utilizzo mayavi2: code.enthought.com/projects/mayavi .
Autoplettico

10
matplotlib ora ha un toolkit 3D
Kit

9
"Matplotlib è scritto e progettato specificamente per Python" - Devo non essere d'accordo. L'API matplotlib è così lontana dal "tipico python" che fa male. Semmai imita la semantica matlab.
Ole

6
Parziale. hai avuto "pochissima esperienza con gnuplot-py". Le informazioni fornite riguardano esclusivamente matplotlib. Anche l'espressione su matplotlib è troppo soggettiva.
calamaro

46

Matplotlib = facilità d'uso, Gnuplot = prestazioni (leggermente migliori)


So che questo post è vecchio e ha risposto ma ero di passaggio e volevo mettere i miei due centesimi. Ecco la mia conclusione: se hai un set di dati non così grande, dovresti usare Matplotlib. È più facile e ha un aspetto migliore. Tuttavia, se hai davvero bisogno di prestazioni, potresti usare Gnuplot. Ho aggiunto del codice per testarlo sulla tua macchina e vedere di persona se fa davvero la differenza (questo non è un vero benchmark delle prestazioni ma dovrebbe dare una prima idea).

Il grafico seguente rappresenta il tempo necessario (in secondi) per:

  • Traccia un grafico a dispersione casuale
  • Salva il grafico in un file png

Gnuplot VS Matplotlib

Configurazione:

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

Ricordo che il divario di prestazioni era molto più ampio quando si esegue su un vecchio computer con versioni precedenti delle librerie (~ 30 secondi di differenza per un grafico a dispersione di grandi dimensioni).

Inoltre, come menzionato nei commenti, è possibile ottenere una qualità equivalente delle trame. Ma dovrai sudare di più per farlo con Gnuplot.


Ecco il codice per generare il grafico se vuoi provarlo sulla tua macchina:

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

7
Inoltre, vorrei aggiungere che in termini di qualità della trama, sono equivalenti se qualcuno non si limita a seguire gli stili predefiniti. Inoltre, gnuplot può essere chiamato facilmente senza dover eseguire Python , quindi è indipendente dal linguaggio!
Atcold

23

matplotlibha una documentazione abbastanza buona e sembra essere abbastanza stabile. Le trame che produce sono bellissime - sicuramente la "qualità della pubblicazione". A causa della buona documentazione e della quantità di codice di esempio disponibile online, è facile da imparare e da usare e non credo che avrai molti problemi a tradurvi il gnuplotcodice. Dopotutto, matplotlib viene utilizzato dagli scienziati per tracciare dati e preparare report, quindi include tutto ciò di cui si ha bisogno.

Un notevole vantaggio di matplotlib è che puoi integrarlo con le GUI di Python ( wxPython e PyQt , almeno) e creare un'applicazione GUI con bei grafici.


16

Dopo aver usato GNUplot (con il mio wrapper Python) per molto tempo (e non mi piaceva davvero l'output anni '80), ho appena iniziato a dare un'occhiata a matplotlib. Devo dire che mi piace molto, l'output sembra davvero carino e la documentazione è di alta qualità ed estesa (anche se questo vale anche per GNUplot). L'unica cosa che ho cercato per secoli nei documenti di matplotlib è come scrivere su un file immagine piuttosto che sullo schermo! Per fortuna questa pagina lo spiega abbastanza bene: http://www.dalkescientific.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html


10
Non sono d'accordo sull'output anni '80 di gnuplot (che si scrive gnuplot e non GPUplot ). Se usi alcuni stili personalizzati (devi definirli solo una volta), ti ritroverai con una bella trama. Basta controllare come altri hanno utilizzato questo fantastico software ( riferimento ).
Atcold

8

Ho giocato con entrambi e mi piace molto di più Matplotlib in termini di integrazione di Python, opzioni e qualità di grafici / grafici.


6

A proposito di prestazioni e tracciamento di un gran numero di punti: ho confrontato questo per uno scatterplot di 500.000 punti caricato da un file di testo e salvato in un png, usando gnuplot * e matplotlib.

500.000 points scatterplot
gnuplot:      5.171 s
matplotlib: 230.693 s

L'ho eseguito solo una volta ei risultati non sembrano identici, ma penso che l'idea sia chiara: gnuplot vince in performance.

* Ho usato gnuplot direttamente poiché la demo di gnuplotpy non funziona immediatamente per me. Matplotlib vince nell'integrazione con Python.


4

Cosa può fare Gnuplot Lo può fare anche Gnuplot-Py. Perché Gnuplot può essere guidato da pipe (pgnuplot). Gnuplot-Py è solo uno strato sottile per questo. Quindi non devi preoccuparti di questo.

Perché preferisco gnuplot forse i molti formati di output (PDF, PS e LaTex), che sono molto utili nei documenti, e l'output predefinito sembra più in stile scientifico :)


3

Alcuni pro di gnuplot(ancora non mi piace matlibplot dopo anni di utilizzo):

  • funzione plot semplicemente con sin(x)(non c'è bisogno di definire array e pensare a intervalli)
  • traccia direttamente i file (non è necessario importarli in un array)
  • tracciare i dati di pipeline (eseguire comandi di shell al volo "<echo 1 2 3")
  • pulsante copia negli appunti
  • stampa più veloce
  • codifica più veloce

gplot.py è un altro wrapper gnuplot wrapper per python e jupyter.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.