python logging matplotlib gnuplot graphing

python - gnuplot vs Matplotlib



logging graphing (7)

Comencé un proyecto graficando registros de Tomcat usando gnuplot-py , correlacionando específicamente solicitudes particulares con asignación de memoria y recolección de basura. ¿Cuál es la sabiduría colectiva en gnuplot-py vs Matplotlib para la representación en Python? ¿Hay mejores bibliotecas gráficas de las que no haya oído hablar?

Mis consideraciones generales son:

  • Mientras que gnuplot tiene una gran cantidad de documentación, gnuplot-py no lo hace. ¿Qué tan buena es la comunidad de documentación para Matplotlib?
  • ¿Hay cosas que gnuplot puede hacer, pero gnuplot-py no puede?
  • ¿Tiene Matplotlib mejor soporte de Python?
  • ¿Hay grandes errores que dejen de mostrar? ¿Molestias?
  • Actualmente gnuplot está graficando 100.000 puntos, estoy planeando escalar esto hasta millones. ¿Debo esperar problemas? ¿Qué tan bien maneja Matplotlib esto?
  • ¿Facilidad de uso, tiempo de respuesta para gnuplot vs Matplotlib?
  • ¿Qué tan fácil sería portar el código existente de gnuplot-py a Matplotlib?

¿Cómo abordarías esta tarea?


Matplotlib = facilidad de uso, Gnuplot = (un poco mejor) rendimiento

Sé que esta publicación es antigua y respondí, pero estaba pasando y quería dar 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, podría usar Gnuplot. He agregado un código para probarlo en tu máquina y ver por ti mismo si hace una diferencia real (esto no es un punto de referencia de rendimiento real, pero debe 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 más amplia cuando se ejecuta en una computadora anterior con versiones anteriores de las bibliotecas (~ 30 segundos de diferencia para una gran gráfica de dispersión).

Además, como se menciona en los comentarios, puede obtener una calidad de parcelas equivalente. Pero tendrás que poner más sudor en eso para hacerlo con Gnuplot.

Aquí está el código para generar el gráfico si quieres probarlo en tu máquina:

# -*- 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()


Acerca del rendimiento y del trazado de una gran cantidad de puntos: lo comparé con un diagrama de dispersión de 500.000 puntos cargado desde un archivo de texto y guardado en png, usando gnuplot * y matplotlib.

500.000 points scatterplot gnuplot: 5.171 s matplotlib: 230.693 s

Lo ejecuté solo una vez y los resultados no parecen idénticos, pero creo que la idea es clara: gnuplot gana en el rendimiento.

* Utilicé gnuplot directamente porque la demostración de gnuplotpy no funciona de fábrica para mí. Matplotlib gana en la integración de Python.


Después de usar GNUplot (con mi propio contenedor Python) durante mucho tiempo (y realmente no me gusta el resultado de los 80), comencé a echar un vistazo a matplotlib. Debo decir que me gusta mucho, el resultado se ve muy bien y los documentos son de alta calidad y extensa (aunque eso también se aplica a GNUplot). ¡Lo único que pasé siglos buscando en los documentos de matplotlib es cómo escribir en un archivo de imagen en lugar de hacerlo en la pantalla! Afortunadamente, esta página lo explica bastante bien: http://www.dalkescientific.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html


He jugado con ambos, y me gusta Matplotlib mucho mejor en términos de integración de Python, opciones y calidad de gráficos / tramas.


Lo que Gnuplot puede hacer Gnuplot-Py también puede hacer. Debido a que Gnuplot puede ser conducido por tubería (pgnuplot). Gnuplot-Py es solo una capa delgada para eso. Entonces no necesitas preocuparte por eso.

Por qué prefiero Gnuplot, tal vez el formato de salida de muchos (PDF, PS y LaTex), que es muy útil en los documentos, y la salida predeterminada se ve más de estilo científico :)


matplotlib tiene una documentación bastante buena, y parece ser bastante estable. Las parcelas que produce son hermosas, de seguro, "calidad de publicación". Debido a la buena documentación y la cantidad de código de ejemplo disponible en línea, es fácil de aprender y usar, y no creo que tenga problemas para traducir el código de gnuplot . Después de todo, matplotlib está siendo utilizado por científicos para trazar datos y preparar informes, por lo que incluye todo lo que uno necesita.

Una ventaja importante de matplotlib es que puede integrarlo con las GUI de Python (al menos, python y wxPython ) y crear aplicaciones GUI con buenas tramas.


  • Puede verificar la documentación de matplotlib usted mismo. Lo encuentro bastante completo.
  • Tengo muy poca experiencia con gnuplot-py, por lo que no puedo decir si puede hacer todo gnuplot.
  • Matplotlib está escrito y diseñado específicamente para Python, por lo que encaja muy bien con los modismos de Python y tal.
  • Matplotlib es un proyecto maduro. La NASA lo usa para algunas cosas.
  • He trazado decenas de millones de puntos en Matplotlib, y todavía se veía hermoso y respondió rápidamente.
  • Más allá de la forma orientada a objetos de usar Matplotlib está la interfaz pylab, que hace que trazar sea tan fácil como lo es en MATLAB, es decir, muy fácil.
  • En cuanto a portar desde gnuplot-py a matplotlib, no tengo idea.