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
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:
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
g = Gnuplot.Gnuplot()
g("set terminal png size 640,480")
plt.clf()
for idx, val in enumerate(numberOfPoints):
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()
x = np.random.randint(sys.maxint, size=val)
y = np.random.randint(sys.maxint, size=val)
gdata = zip(x,y)
start = timer()
mPlotAndSave(x, y)
end = timer()
matplotlibTime.append(end - start)
start = timer()
gPlotAndSave(gdata, g)
end = timer()
gnuplotTime.append(end - start)
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()