его против библиотек matplotlib


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

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

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

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

7 71

7 ответов:

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

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

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

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

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

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

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

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

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

500.000 points scatterplot
gnuplot:      5.171 s
matplotlib: 230.693 s

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

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