Question

J'ai commencé un projet graphique enregistre Tomcat en utilisant gnuplot-py , spécifiquement en corrélation avec des demandes particulières allocation de mémoire et la collecte des déchets. Quel est le la sagesse collective sur gnuplot-py vs Matplotlib pour Python graphique. Y at-il de meilleures bibliothèques graphiques là-bas, je ne l'ai pas entendu parler?

Mes considérations générales sont:

  • Alors que gnuplot a de grandes quantités de documents, gnuplot-py ne fonctionne pas. Quelle est la communauté de documentation pour Matplotlib?
  • Y at-il des choses qui gnuplot peut faire, mais gnuplot-py ne peut pas?
  • Est-ce que Matplotlib un meilleur support de Python?
  • Y at-il des gros bugs d'arrêt show en soit? Désagréments?
  • Actuellement GNUPlot est de ce graphique 100.000 points, j'ai l'intention de mise à l'échelle jusqu'à ce millions. Dois-je attendre à des problèmes? Dans quelle mesure gérer cette Matplotlib?
  • Facilité d'utilisation, le temps d'exécution pour gnuplot vs Matplotlib?
  • Comment serait-il facile à coder gnuplot-py existant port Matplotlib?

Comment aborderez-vous cette tâche?

Était-ce utile?

La solution

  • Vous pouvez consulter documentation de matplotlib vous. Je trouve assez complet.
  • J'ai très peu d'expérience avec gnuplot-py, donc je ne peux pas dire si elle peut faire tout peut gnuplot.
  • Matplotlib est écrit et conçu spécifiquement pour Python, il convient très bien avec les idiomes Python et autres.
  • Matplotlib est un projet mature. La NASA utilise pour certaines choses.
  • J'ai comploté des dizaines de millions de points dans Matplotlib, et encore regardé belle et ont rapidement réagi.
  • Au-delà de la manière orientée objet de l'utilisation Matplotlib est l'interface pylab, ce qui rend tracé aussi facile que dans Matlab - c'est très facile
  • .
  • En ce qui concerne le portage de gnuplot-py à Matplotlib, je ne sais pas.

Autres conseils

Matplotlib = facilité d'utilisation, Gnuplot = performances (un peu mieux)


Je sais que ce poste est vieux et répondu, mais je passais et je voulais mettre mes deux cents. Voici ma conclusion: si vous avez un ensemble de données pas si grand, vous devez utiliser Matplotlib. Il est plus facile et semble mieux. Toutefois, si vous vraiment ont 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 différence réelle (ce n'est pas un véritable point de repère de la performance, mais devrait donner une première idée).

Le graphique ci-dessous représente le temps nécessaire (en seconde) à:

  • Tracer la courbe de dispersion aléatoire
  • Enregistrer 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 de l'écart de performance étant beaucoup plus large lorsqu'il est exécuté sur un ordinateur plus ancien avec les anciennes versions 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 mettre plus de sueur dans ce pour le faire avec Gnuplot.


Voici le code pour générer le graphique si vous voulez essayer 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 assez bonne documentation, et semble être tout à fait stable. Les parcelles qu'il produit sont belles - la « qualité de publication » à coup sûr. En raison de la bonne documentation et la quantité de code exemple disponible en ligne, il est facile à apprendre et à utiliser, et je ne pense pas que vous aurez beaucoup de mal à traduire le code gnuplot à elle. Après tout, matplotlib est utilisé par les scientifiques pour tracer des données et préparer des rapports -. Il comprend tout ce dont on a besoin

Un avantage marqué de matplotlib est que vous pouvez l'intégrer avec Python (interfaces graphiques et href="http://eli.thegreenplace.net/2009/01/20/matplotlib-with-pyqt-guis/" rel="noreferrer"> PyQt , au moins) et de créer l'application GUI avec des parcelles agréables.

Après avoir utilisé GNUplot (avec mon propre wrapper Python) depuis longtemps (et vraiment ne pas aimer la sortie des années 80 prospectifs), je viens de commencer à avoir un regard matplotlib. Je dois dire que je l'aime beaucoup, la sortie ressemble vraiment agréable et les documents sont de haute qualité et une vaste (bien que cela vaut aussi pour GNUplot). La seule chose que j'ai passé les âges à la recherche dans les matplotlib docs est de savoir comment écrire dans un fichier image plutôt que sur l'écran! Heureusement, cette page explique assez bien: http: // www .dalkescientific.com / écrits / journal / archive / 2005/04/23 / matplotlib_without_gui.html

Je l'ai joué à la fois, et je l'aime Matplotlib beaucoup mieux en termes d'intégration Python, les options et la qualité des graphiques / parcelles.

Qu'est-ce que Gnuplot peut faire Gnuplot-Py peut faire aussi. Parce que Gnuplot peut être entraîné par le conduit (pgnuplot). Gnuplot-Py est juste une couche mince pour elle. Donc, vous n'avez pas besoin inquiéter.

Pourquoi je préfère GNUplot peut-être le nombre de format de sortie (PDF, PS et LaTex), ce qui est très utile dans les journaux, et la sortie par défaut ressemble plus de style scientifique:)

A propos de la performance et tracer un grand nombre de points. Je comparais cela pour un nuage de points 500.000 points de chargés à partir d'un fichier texte et enregistrées dans un .png, en utilisant gnuplot * et matplotlib

500.000 points scatterplot
gnuplot:      5.171 s
matplotlib: 230.693 s

je l'ai couru une seule fois et les résultats ne regarde pas identiques, mais je pense que l'idée est claire:. Gnuplot gagne à la performance

* je gnuplot directement depuis la démo gnuplotpy ne fonctionne pas hors-the-box pour moi. Matplotlib gagne à l'intégration Python.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top