web-dev-qa-db-fra.com

gnuplot vs Matplotlib

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:

  • Bien que gnuplot ait une grande quantité de documentation, gnuplot-py n'en a pas. Quelle est la qualité de la communauté de documentation pour Matplotlib?
  • Y a-t-il des choses que gnuplot peut faire, mais pas gnuplot-py?
  • Matplotlib a-t-il un meilleur support Python?
  • Y a-t-il de gros bogues d'arrêt de spectacle dans les deux? Des ennuis?
  • Actuellement, gnuplot représente 100 000 points, je prévois de les augmenter à des millions. Dois-je m'attendre à des problèmes? Dans quelle mesure Matplotlib gère-t-il cela?
  • Facilité d'utilisation, délai d'exécution pour gnuplot vs Matplotlib?
  • Serait-il facile de porter le code gnuplot-py existant sur Matplotlib?

Comment aborderiez-vous cette tâche?

77
Ethan Heilman
  • Vous pouvez vérifier documentation de matplotlib vous-même. Je le trouve assez complet.
  • J'ai très peu d'expérience avec gnuplot-py, donc je ne peux pas dire s'il peut faire tout ce que gnuplot peut.
  • Matplotlib est écrit et conçu spécifiquement pour Python, il s'intègre donc très bien avec les idiomes Python et autres).
  • Matplotlib est un projet mature. La NASA l'utilise pour certaines choses.
  • J'ai tracé des dizaines de millions de points dans Matplotlib, et il était toujours beau et a répondu rapidement.
  • Au-delà de la manière orientée objet d'utiliser Matplotlib, il y a l'interface pylab, qui rend le traçage aussi facile que dans MATLAB - c'est-à-dire, très facile.
  • Quant au portage de gnuplot-py vers matplotlib, je n'en ai aucune idée.
50
Autoplectic

Matplotlib = facilité d'utilisation, Gnuplot = performances (légèrement meilleures)


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:

  • Tracer un graphe de dispersion aléatoire
  • Enregistrez le graphique dans un fichier png

Gnuplot VS Matplotlib

Configuration:

  • gnuplot: 5.2.2
  • gnuplot-py: 1,8
  • matplotlib: 2.1.2

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()
42
7hibault

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.

21
Eli Bendersky

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

15
Wim

J'ai joué avec les deux, et j'aime beaucoup Matplotlib en termes de Python, options et qualité des graphiques/tracés.

8
Corey Goldberg

À 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.

4
Mark

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 :)

4
joseph.smeng