gnuplot против Matplotlib

Matplotlib = простота использования, Gnuplot = (немного лучше) производительность

Я знаю, что это старое сообщение, и gnuplot я ответил на него, но я проходил matplotlib мимо и хотел вложить свои python-interpreter два цента. Вот мой вывод: если python у вас не очень большой набор plt данных, вам следует использовать pythonic Matplotlib. Так проще и лучше py выглядит. Однако, если вам plt действительно нужна производительность, вы python-shell можете использовать Gnuplot. Я py добавил код, чтобы протестировать pythonista его на вашем компьютере и py убедиться, действительно python-interpreter ли он имеет значение (это plt не настоящий тест производительности, но python-shell он должен дать первое представление).

На logging следующем графике показано pylab необходимое время (в секундах), чтобы:

  • Постройте график случайного рассеяния.
  • Сохранить график в файл PNG.

gnuplot против Matplotlib_pythonista

Конфигурация:

  • gnuplot: 5.2.2
  • gnuplot-py: 1.8
  • matplotlib: 2.1.2

Я matplotlib помню, что разрыв в производительности logger был намного больше при работе pythonic на старом компьютере со старыми gnuplot версиями библиотек (разница pythonic ~ 30 секунд для большой диаграммы pythonic разброса).

Более того, как pythonista уже упоминалось в комментариях, вы logging можете получить сюжеты аналогичного logger качества. Но вам придется plt приложить больше усилий, чтобы log сделать это с помощью Gnuplot.


Here's the code to generate the graph, если logger вы хотите попробовать его log на своем компьютере:

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

python

logging

matplotlib

gnuplot

graphing

2022-10-15T01:03:56+00:00