Гнуплот против Матплотлиб - PullRequest
77 голосов
/ 26 мая 2009

Я начал работу над графиком Tomcat журналов, используя gnuplot-py , специально связывая конкретные запросы с выделением памяти и сборкой мусора. Что Коллективная мудрость на gnuplot-py vs Matplotlib для графического представления на Python. Есть ли лучшие графические библиотеки, о которых я не слышал?

Мои общие соображения таковы:

  • Хотя gnuplot имеет большое количество документации, gnuplot-py нет. Насколько хорошо сообщество документации для Matplotlib?
  • Есть ли вещи, которые может делать gnuplot, но gnuplot-py не может?
  • Имеет ли Matplotlib лучшую поддержку Python?
  • Есть ли в шоу большие ошибки, мешающие остановить? Раздражали?
  • В настоящее время gnuplot составляет 100 000 точек, я планирую увеличить их до миллионов. Стоит ли ожидать проблем? Насколько хорошо Matplotlib справляется с этим?
  • Простота использования, время обработки для gnuplot против Matplotlib?
  • Насколько легко было бы перенести существующий код gnuplot-py на Matplotlib?

Как бы вы подошли к этой задаче?

Ответы [ 7 ]

50 голосов
/ 26 мая 2009
  • Вы можете проверить документацию на matplotlib самостоятельно. Я нахожу это довольно всеобъемлющим.
  • У меня очень мало опыта работы с gnuplot-py, поэтому я не могу сказать, может ли он делать все, что может gnuplot.
  • Matplotlib написан и разработан специально для Python, поэтому он очень хорошо сочетается с идиомами Python и тому подобным.
  • Matplotlib - зрелый проект. НАСА использует это для некоторых вещей.
  • Я нанес десятки миллионов точек в Matplotlib, и он все еще выглядел красиво и быстро реагировал.
  • Помимо объектно-ориентированного способа использования Matplotlib, есть интерфейс pylab, который делает построение графиков таким же простым, как в MATLAB - то есть очень простым.
  • Что касается переноса из gnuplot-py в matplotlib, я понятия не имею.
41 голосов
/ 27 мая 2014

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


Я знаю, что этот пост старый и ответил, но я проходил мимо и хотел поставить свои два цента. Вот мой вывод: если у вас небольшой набор данных, вы должны использовать Matplotlib. Это проще и выглядит лучше. Однако, если вам действительно нужна производительность, вы можете использовать Gnuplot. Я добавил некоторый код, чтобы протестировать его на вашей машине и убедиться, что он действительно имеет значение (это не реальный тест производительности, но он должен дать первое представление).

Следующий график представляет требуемое время (в секундах) для:

  • График случайного рассеяния
  • Сохранить график в png-файле

Gnuplot VS Matplotlib

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

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

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

Более того, как уже упоминалось в комментариях, вы можете получить эквивалентное качество графиков. Но вам придется потратить на это больше пота, чтобы сделать это с Gnuplot.


Вот код для генерации графика , если вы хотите попробовать его на своем компьютере:

# -*- 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()
21 голосов
/ 26 мая 2009

matplotlib имеет довольно хорошую документацию и выглядит довольно стабильно. Сюжеты, которые он производит, прекрасны - «качество публикации» наверняка. Из-за хорошей документации и большого количества примеров кода, доступных онлайн, его легко изучить и использовать, и я не думаю, что у вас будут большие проблемы с переводом gnuplot кода в него. В конце концов, matplotlib используется учеными для построения графиков и подготовки отчетов, поэтому он включает в себя все, что нужно.

Одним заметным преимуществом matplotlib является то, что вы можете интегрировать его с Python GUI ( wxPython и PyQt , по крайней мере) и создать приложение с графическим интерфейсом с хорошими графиками.

15 голосов
/ 25 декабря 2009

После использования GNUplot (с моей собственной оболочкой Python) в течение длительного времени (и на самом деле не нравится вывод 80-х), я просто начал смотреть на matplotlib. Я должен сказать, что мне это очень нравится, результат выглядит действительно хорошо, а документы высокого качества и обширны (хотя это также относится и к GNUplot). Единственное, что я потратил целую вечность в документах matplotlib, - это как записать файл изображения, а не на экран! К счастью, эта страница объясняет это довольно хорошо: http://www.dalkescientific.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html

8 голосов
/ 26 мая 2009

Я играл с обоими, и мне больше нравится Matplotlib с точки зрения интеграции с Python, параметров и качества графиков / графиков.

4 голосов
/ 11 января 2015

О производительности и построении большого количества точек: я сравнил это для диаграммы рассеяния в 500.000 точек, загруженной из текстового файла и сохраненной в png, используя gnuplot * и matplotlib.

500.000 points scatterplot
gnuplot:      5.171 s
matplotlib: 230.693 s

Я запустил его только один раз, и результаты не выглядят одинаково, но я думаю, что идея ясна: gnuplot выигрывает в производительности.

* Я использовал gnuplot напрямую, так как демо gnuplotpy не работает для меня "из коробки". Matplotlib побеждает в интеграции с Python.

4 голосов
/ 02 марта 2013

То, что Gnuplot может делать Gnuplot-Py тоже может делать. Потому что Gnuplot может управляться по трубе (pgnuplot). Gnuplot-Py - это всего лишь тонкий слой для него. Так что вам не нужно об этом беспокоиться.

Почему я предпочитаю gnuplot, может быть, формат вывода многих (PDF, PS и LaTex), который очень полезен в работах, а вывод по умолчанию выглядит более научным:)

...