J'ai commencé sur un projet représentant graphiquement les journaux de Tomcat en utilisant gnuplot-py , en corrélant spécifiquement les demandes particulières avec l'allocation de mémoire et la récupération de place. Quelle est la sagesse collective sur gnuplot-py vs Matplotlib for Python graphing. Existe-t-il de meilleures bibliothèques graphiques là-bas dont je n'ai pas entendu parler?
Mes considérations générales sont:
Comment aborderiez-vous cette tâche?
Je sais que ce message est ancien et a répondu, mais je passais par là et je voulais mettre mes deux cents. Voici ma conclusion: si vous avez un ensemble de données moins important, vous devez utiliser Matplotlib. C'est plus facile et plus joli. Cependant, si vous avez vraiment besoin de performances, vous pouvez utiliser Gnuplot. J'ai ajouté du code pour le tester sur votre machine et voir par vous-même si cela fait une réelle différence (ce n'est pas une vraie référence de performance mais devrait donner une première idée).
Le graphique suivant représente le temps requis (en secondes) pour:
Configuration:
Je me souviens que l'écart de performances était beaucoup plus large lors de l'exécution sur un ordinateur plus ancien avec des versions plus anciennes des bibliothèques (~ 30 secondes de différence pour un grand nuage de points).
De plus, comme mentionné dans les commentaires, vous pouvez obtenir une qualité équivalente des parcelles. Mais vous devrez y mettre plus de sueur pour le faire avec Gnuplot.
Voici le code pour générer le graphe si vous voulez faire un essai sur votre machine:
# -*- 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
a une assez bonne documentation et semble assez stable. Les parcelles qu'elle produit sont magnifiques - "qualité de publication" à coup sûr. En raison de la bonne documentation et de la quantité d'exemples de code disponibles en ligne, il est facile à apprendre et à utiliser, et je ne pense pas que vous aurez beaucoup de mal à traduire le code gnuplot
. Après tout, matplotlib est utilisé par les scientifiques pour tracer des données et préparer des rapports - il inclut donc tout ce dont on a besoin.
Un avantage notable de matplotlib est que vous pouvez l'intégrer avec les interfaces graphiques Python ( wxPython et PyQt , au moins) et créer une application GUI avec Belles parcelles.
Après avoir utilisé GNUplot (avec mon propre wrapper Python) pendant longtemps (et vraiment ne pas aimer la sortie des années 80), j'ai juste commencé à jeter un œil à matplotlib. Je dois dire que j'aime ça beaucoup, la sortie semble vraiment agréable et les documents sont de haute qualité et étendus (bien que cela vaut également pour GNUplot). La seule chose que j'ai passé des temps à chercher dans les documents matplotlib est de savoir comment écrire dans un fichier image plutôt que sur l'écran ! Heureusement, cette page l'explique assez bien: http://www.dalkescientific.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html
J'ai joué avec les deux, et j'aime beaucoup Matplotlib en termes de Python, options et qualité des graphiques/tracés.
À propos des performances et du traçage d'un grand nombre de points: j'ai comparé cela pour un nuage de points de 500 000 points chargé à partir d'un fichier texte et enregistré au format png, en utilisant gnuplot * et matplotlib.
500.000 points scatterplot
gnuplot: 5.171 s
matplotlib: 230.693 s
Je ne l'ai exécuté qu'une seule fois et les résultats ne semblent pas identiques, mais je pense que l'idée est claire: gnuplot gagne en performance.
* J'ai utilisé gnuplot directement car la démo gnuplotpy ne fonctionne pas immédiatement pour moi. Matplotlib gagne à Python.
Ce que Gnuplot peut faire Gnuplot-Py peut faire aussi. Parce que Gnuplot peut être entraîné par un tuyau (pgnuplot). Gnuplot-Py n'est qu'une mince couche pour cela. Vous n'avez donc pas à vous en préoccuper.
Pourquoi je préfère gnuplot peut-être les nombreux formats de sortie (PDF, PS et LaTex), qui sont très utiles dans les papiers, et la sortie par défaut ressemble plus à un style scientifique :)