Matplotlib = facilidad de uso, Gnuplot = rendimiento (ligeramente mejor)
Sé que esta publicación es antigua y está respondida pero estaba pasando y quería poner mi granito de arena. Aquí está mi conclusión: si tiene un conjunto de datos no tan grande, debe usar Matplotlib. Es más fácil y se ve mejor. Sin embargo, si realmente necesita rendimiento, puede usar Gnuplot. Agregué un código para probarlo en su máquina y ver por sí mismo si hace una diferencia real (este no es un punto de referencia de rendimiento real, pero debería dar una primera idea).
El siguiente gráfico representa el tiempo requerido (en segundos) para:
- Trazar un gráfico de dispersión aleatorio
- Guarde el gráfico en un archivo png
Configuración:
- gnuplot: 5.2.2
- gnuplot-py: 1.8
- matplotlib: 2.1.2
Recuerdo que la brecha de rendimiento es mucho mayor cuando se ejecuta en una computadora más antigua con versiones anteriores de las bibliotecas (~ 30 segundos de diferencia para un diagrama de dispersión grande).
Además, como se menciona en los comentarios, puede obtener una calidad equivalente de parcelas. Pero tendrás que sudar más para hacerlo con Gnuplot.
Aquí está el código para generar el gráfico si desea probarlo en su máquina:
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()