gnuplot против Matplotlib

84

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

Мои общие соображения:

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

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

Итан Хейлман
источник
Еще одна оболочка gnuplot - это gplot.py, которая также работает в jupyter .
Фридрих

Ответы:

51
  • Вы можете сами проверить документацию matplotlib . Я считаю это довольно всеобъемлющим.
  • У меня очень мало опыта работы с gnuplot-py, поэтому я не могу сказать, может ли он делать все, что может gnuplot.
  • Matplotlib написан и разработан специально для Python, поэтому он очень хорошо сочетается с идиомами Python и т.п.
  • Matplotlib - зрелый проект. НАСА использует его для некоторых вещей.
  • Я нанес десятки миллионов точек в Matplotlib, и он по-прежнему выглядел красиво и быстро реагировал.
  • Помимо объектно-ориентированного способа использования Matplotlib, существует интерфейс pylab, который делает построение графиков таким же простым, как в MATLAB, то есть очень простым.
  • Что касается переноса с gnuplot-py на matplotlib, я понятия не имею.
Аутоплексический
источник
3
Единственный плюс, который я могу сказать для gnuplot, заключается в том, что matplotlib не имеет возможностей 3D-построения. Кроме того, до сих пор я использовал обе предпочтительные библиотеки matplotlib.
Physicsmichael
1
@ vgm64: в текущем SVN снова добавлено 3D. Я сам ничего из этого не тестировал, поэтому не могу сказать, насколько он хорош. для трехмерного построения я использую mayavi2: code.enoughtt.com/projects/mayavi .
Аутоплексия
10
matplotlib теперь имеет набор инструментов 3D
Kit
9
«Matplotlib написан и разработан специально для Python» - я не согласен. API matplotlib настолько далек от «типичного питона», что это больно. Во всяком случае, он имитирует семантику Matlab.
Ole
6
Предвзято. у вас был «очень небольшой опыт работы с gnuplot-py». Приведенная информация касается matplotlib. Выражение о matplotlib тоже слишком субъективно.
squid
46

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


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

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

  • Постройте случайный график разброса
  • Сохраните график в файл png

Гнуплот VS Матплотлиб

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

  • 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()
7hibault
источник
7
Более того, я хотел бы добавить, что с точки зрения качества сюжета они эквивалентны, если кто-то просто не использует стили по умолчанию. Более того, gnuplot можно легко вызвать без запуска Python , поэтому он не зависит от языка!
Атколд,
23

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

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

Эли Бендерский
источник
16

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

Wim
источник
10
Я не могу согласиться с выводом gnuplot в стиле 80-х (который пишется как gnuplot, а не GPUplot ). Если вы используете несколько пользовательских стилей (их нужно определить только один раз), вы получите красивый сюжет. Просто посмотрите, как другие используют эту замечательную программу ( ссылка ).
Атколд,
8

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

Кори Голдберг
источник
6

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

500.000 points scatterplot
gnuplot:      5.171 s
matplotlib: 230.693 s

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

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

отметка
источник
4

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

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

joseph.smeng
источник
3

Некоторые gnuplotпреимущества (мне все еще не нравится matlibplot после многих лет использования):

  • график функции просто с sin(x)(нет необходимости определять массивы и думать о диапазонах)
  • сюжетные файлы напрямую (нет необходимости импорта в массив)
  • построение конвейерных данных (выполнение команд оболочки на лету "<echo 1 2 3")
  • кнопка копирования в буфер обмена
  • более быстрое построение
  • более быстрое кодирование

gplot.py - это еще одна оболочка-обертка gnuplot для python и jupyter.

Фридрих
источник