его против библиотек 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 ответов:
- вы можете проверить документация matplotlib себя. Я нахожу его вполне исчерпывающим.
- У меня очень мало опыта работы с gnuplot-py, поэтому я не могу сказать, Может ли он сделать все, что может gnuplot.
- Matplotlib написан и разработан специально для Python, поэтому он очень хорошо сочетается с идиомами Python и т. д.
- Matplotlib-это зрелый проект. НАСА использует его для некоторых вещей.
- Я построил десятки миллионов точек в Matplotlib, и он по-прежнему выглядел красиво и быстро ответил.
- помимо объектно-ориентированного способа использования Matplotlib является интерфейс pylab, который делает построение так же легко, как и в MATLAB-то есть, очень легко.
- что касается переноса из gnuplot-py в matplotlib, я понятия не имею.
Matplotlib = простота использования, Gnuplot = (немного лучше) производительность
Я знаю, что этот пост старый и ответил, но я проходил мимо и хотел положить свои два цента. Вот мой вывод: если у вас есть не очень большой набор данных, вы должны использовать Matplotlib. Это проще и выглядит лучше. Однако, если вы действительно нужна производительность, вы можете использовать Gnuplot. Я добавил некоторый код, чтобы проверить его на вашей машине и посмотреть на себя, если это имеет реальное значение (это не является реальным эталоном производительности, но должен дать первую идею).
следующий график представляет необходимое время (в секундах):
- построить случайный график рассеяния
- сохраните график в файл png
конфигурация:
- 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.