Domanda

Ho iniziato su una grafica Tomcat registra utilizzando gnuplot-py , in particolare la correlazione particolari richieste con allocazione della memoria e garbage collection. Qual 'é saggezza collettiva su gnuplot-py vs Matplotlib per Python grafica. Ci sono migliori librerie di grafici là fuori che non ho sentito parlare?

Le mie considerazioni generali sono:

  • Mentre gnuplot ha una grande quantità di documentazione, gnuplot-py non lo fa. Quanto è buono è la comunità documentazione per Matplotlib?
  • Ci sono cose che gnuplot può fare, ma gnuplot-py non può?
  • La Matplotlib ha un miglior supporto Python?
  • sono ci sono grandi insetti esposizione che arresta in entrambi? Contrattempi?
  • Attualmente Gnuplot è Rappresentazione grafica 100.000 di punti di, sto pensando di ridimensionamento questo fino a milioni. Dovrei aspettare problemi? In che Matplotlib gestire questo?
  • Facilità di utilizzo, i tempi di consegna per gnuplot vs Matplotlib?
  • Come sarebbe facile per il codice porta esistente gnuplot-py a matplotlib?

Come vorresti affrontare questo compito?

È stato utile?

Soluzione

  • È possibile controllare documentazione del matplotlib te . Trovo abbastanza completo.
  • Ho poca esperienza con gnuplot-py, quindi non posso dire se si può fare tutto può gnuplot.
  • Matplotlib è scritto e progettato specificamente per Python, quindi si adatta molto bene con idiomi Python e così via.
  • Matplotlib è un progetto maturo. NASA lo utilizza per alcune cose.
  • ho tramato decine di milioni di punti in Matplotlib, e sembrava ancora bella e ha risposto rapidamente.
  • Al di là del modo orientato agli oggetti di utilizzare Matplotlib è l'interfaccia pylab, il che rende tracciando così facile come è in MATLAB - vale a dire, molto facile
  • .
  • Per quanto riguarda il porting da gnuplot-py a matplotlib, non ho idea.

Altri suggerimenti

Matplotlib = facilità d'uso, Gnuplot = (un po 'meglio) prestazioni


So che questo post è vecchio e ha risposto ma ero di passaggio e voluto mettere i miei due centesimi. Ecco la mia conclusione: se si dispone di un non-so-grande insieme di dati, è necessario utilizzare Matplotlib. E 'più facile e sembra migliore. Tuttavia, se si davvero hanno bisogno di prestazioni, è possibile utilizzare Gnuplot. Ho aggiunto un certo codice di provarlo sulla vostra macchina e vedere di persona se si fa la differenza (questo non è un punto di riferimento di prestazioni reali, ma dovrebbe dare una prima idea).

Il grafico rappresenta il tempo desiderato (in secondi):

  • Tracciare la curva dispersione casuale
  • Salvare il grafico in un file PNG

Gnuplot VS Matplotlib

Configurazione:

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

Mi ricordo il divario di prestazioni di essere molto più ampio quando si esegue su un vecchio computer con le versioni precedenti delle librerie (~ 30 secondi la differenza per un grande appezzamento dispersione).

Inoltre, come menzionate nelle osservazioni, è possibile ottenere la qualità equivalente di trame. Ma si dovrà mettere più sudore in quella di farlo con Gnuplot.


Ecco il codice per generare il grafico se si vuole fare un tentativo sulla vostra 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()

matplotlib ha abbastanza buona documentazione, e sembra essere abbastanza stabile. Le trame che produce sono belle - "qualità pubblicazione" di sicuro. Grazie alla buona documentazione e la quantità di codice di esempio disponibili on-line, è facile da imparare e da usare, e non credo che avrete troppi problemi a tradurre il codice gnuplot ad esso. Dopo tutto, matplotlib viene utilizzato dagli scienziati per tracciare i dati e di elaborare relazioni -. In modo che include tutto il necessario

Una notevole vantaggio di matplotlib è che si può integrarlo con Python GUI ( wxPython e PyQt , almeno) e creare applicazioni GUI con belle trame.

Dopo aver usato GNUplot (con il mio Python involucro) per un lungo periodo di tempo (e in realtà non gradire l'uscita 80-looking), ho appena iniziato avere uno sguardo matplotlib. Devo dire che mi piace molto, l'uscita sembra davvero bello e la documentazione sono di alta qualità e ampia (anche se questo vale anche per GNUplot). L'unica cosa che ho trascorso le età alla ricerca di nella documentazione matplotlib è come scrivere un file immagine, piuttosto che sullo schermo! Per fortuna questa pagina spiega abbastanza bene: http: // www .dalkescientific.com / scritture / diario / archive / 2005/04/23 / matplotlib_without_gui.html

Ho giocato con entrambi, e mi piace Matplotlib molto meglio in termini di integrazione Python, le opzioni, e la qualità dei grafici / rustico.

Cosa può fare Gnuplot Gnuplot-Py può fare troppo. Poiché Gnuplot può essere mosso da tubo (pgnuplot). Gnuplot-Py è solo un sottile strato per esso. Quindi non è necessario preoccuparsi di esso.

Perché preferisco gnuplot forse molti formato di output (PDF, PS e lattice), che è molto utile nei documenti, e l'output predefinito sembra più scientifico-style:)

A proposito di prestazioni e tracciando un gran numero di punti:. Ho confrontato questo per un grafico a dispersione di 500.000 punti caricati da un file di testo e salvati in una png, utilizzando gnuplot * e matplotlib

500.000 points scatterplot
gnuplot:      5.171 s
matplotlib: 230.693 s

ho corso solo una volta ed i risultati non sembrano identici, ma penso che l'idea è chiara:. Gnuplot vince a prestazioni

* Ho usato gnuplot direttamente dal momento che il gnuplotpy demo non funziona out-of-the-box per me. Matplotlib vince a integrazione Python.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top