Pregunta

He comenzado en un proyecto de graficación. Gato registros usando gnuplot-py, correlacionando específicamente solicitudes particulares con la asignación de memoria y la recolección de basura.¿Cuál es la sabiduría colectiva en gnuplot-py vs Matplotlib para gráficos de Python.¿Existen mejores bibliotecas de gráficos de las que no he oído hablar?

Mis consideraciones generales son:

  • Si bien gnuplot tiene una gran cantidad de documentación, gnuplot-py no.¿Qué tan buena es la comunidad de documentación para Matplotlib?
  • ¿Hay cosas que gnuplot puede hacer, pero gnuplot-py no?
  • ¿Matplotlib tiene mejor soporte para Python?
  • ¿Hay errores importantes que impiden el espectáculo en alguno de los dos?¿Molestias?
  • Actualmente, gnuplot está graficando 100.000 puntos, estoy planeando ampliar esto a millones.¿Debo esperar problemas?¿Qué tan bien maneja esto Matplotlib?
  • ¿Facilidad de uso, tiempo de respuesta para gnuplot vs Matplotlib?
  • ¿Qué tan fácil sería portar el código gnuplot-py existente a Matplotlib?

¿Cómo abordarías esta tarea?

¿Fue útil?

Solución

  • Puede comprobar documentación del matplotlib mismo. Me parece bastante amplia.
  • Me tiene muy poca experiencia con gnuplot-py, por lo que no puede decir si se puede hacer todo gnuplot lata.
  • Matplotlib está escrito en y diseñado específicamente para Python, por lo que encaja muy bien con modismos Python y tal.
  • Matplotlib es un proyecto maduro. La NASA lo utiliza para algunas cosas.
  • He tracé decenas de millones de puntos en Matplotlib, y todavía se veía hermosa y respondió rápidamente.
  • Más allá de la forma orientada a objetos de uso Matplotlib es la interfaz pylab, lo que hace que el trazado tan fácil como lo es en MATLAB - es decir, muy fácil
  • .
  • En cuanto a la portabilidad de gnuplot-py a matplotlib, no tengo ni idea.

Otros consejos

Matplotlib = facilidad de uso, Gnuplot = rendimiento (ligeramente mejor)


Sé que este post es viejo y contesté, pero yo estaba pasando por y quería poner mi granito de arena. Aquí es mi conclusión: si usted tiene un conjunto de datos no tan grande, se debe utilizar Matplotlib. Es más fácil y se ve mejor. Sin embargo, si realmente necesitan rendimiento, se puede usar Gnuplot. He añadido algo de código para probarlo en su máquina y ver por sí mismo si se hace una diferencia real (esto no es una verdadera referencia de rendimiento, pero debe dar una primera idea).

El siguiente gráfico representa el tiempo requerido (en segundos) a:

  • Plot un gráfico de dispersión aleatoria
  • Guardar el gráfico en un archivo PNG

Gnuplot VS Matplotlib

Configuración:

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

Me acuerdo de la diferencia de rendimiento es mucho mayor cuando se ejecuta en un equipo antiguo con versiones anteriores de las bibliotecas (~ diferencia de 30 segundos para un gran gráfico de dispersión).

Por otra parte, como lo mencionan en los comentarios, se puede obtener una calidad equivalente a las parcelas. Pero usted tendrá que poner más sudor en que hacerlo con Gnuplot.


Aquí está el código para generar el gráfico si quieres darle una oportunidad en el equipo :

# -*- 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 tiene bastante buena documentación, y parece ser bastante estable. Las parcelas que produce son hermosa - "calidad de publicación" a ciencia cierta. 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 tengas muchos problemas traducir código gnuplot a ella. Después de todo, matplotlib está siendo utilizado por los científicos para trazar datos y preparar informes -. Por lo que incluye todo lo necesario

Una ventaja notable de matplotlib es que se puede integrar con interfaces gráficas de usuario (Python y href="http://eli.thegreenplace.net/2009/01/20/matplotlib-with-pyqt-guis/" rel="noreferrer"> PyQt , por lo menos) y crear aplicaciones GUI con bonitas parcelas.

Después de usar GNUPlot (con mi propio envoltorio de Python) durante mucho tiempo (y realmente no le gustaba la salida 80-mirando), Acabo de empezar a echar un vistazo a matplotlib. Debo decir que me gusta mucho, la salida se ve muy bonito y los documentos son de alta calidad y extensa (aunque eso también vale para GNUPlot). Lo único que pasó las edades que buscan en los documentos matplotlib es la forma de escribir en un archivo de imagen en lugar de a la pantalla! Por suerte esta página lo explica muy bien: http: // www .dalkescientific.com / escritos / diario / archivo / 2005/04/23 / matplotlib_without_gui.html

He jugado con los dos, y me gusta Matplotlib mucho mejor en términos de integración de Python, las opciones y la calidad de los gráficos / parcelas.

¿Qué puede hacer Gnuplot Gnuplot-Py puede hacer también. Debido Gnuplot puede ser impulsado por la tubería (pgnuplot). Gnuplot-Py es sólo una capa delgada para ello. Así que no es necesario preocuparse por ello.

¿Por qué prefiero GNUPlot tal vez el formato de salida de muchos (PDF, PS y látex), que es muy útil en los documentos, y la salida por defecto se parece más al estilo científico:)

Sobre el rendimiento y el trazado de una gran cantidad de puntos:Comparé esto 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é sólo una vez y los resultados no parecen idénticos, pero creo que la idea es clara:gnuplot gana en rendimiento.

* Utilicé gnuplot directamente ya que la demostración de gnuplotpy no funciona de inmediato.Matplotlib gana en la integración de Python.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top