Я начал свой проект с графическим отображением журналов 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?
Как бы вы подошли к этой задаче?
Ответы:
источник
Matplotlib = простота использования, Gnuplot = (немного лучше) производительность
Я знаю, что этот пост старый, и на него я ответил, но я проходил мимо и хотел вложить свои два цента. Вот мой вывод: если у вас не очень большой набор данных, вам следует использовать Matplotlib. Так проще и лучше выглядит. Однако, если вам действительно нужна производительность, вы можете использовать Gnuplot. Я добавил код, чтобы протестировать его на вашем компьютере и убедиться, действительно ли он имеет значение (это не настоящий тест производительности, но он должен дать первое представление).
На следующем графике показано необходимое время (в секундах), чтобы:
Конфигурация:
Я помню, что разрыв в производительности был намного больше при работе на старом компьютере со старыми версиями библиотек (разница ~ 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 ) и создавать приложение с графическим интерфейсом с красивыми графиками.
источник
После долгого использования GNUplot (с моей собственной оболочкой Python) (и мне действительно не нравился результат, выглядящий как 80-е), я только начал смотреть на matplotlib. Я должен сказать, что мне это очень нравится, результат выглядит очень красиво, а документация высококачественная и обширная (хотя это также касается GNUplot). Единственная вещь, которую я потратил целую вечность на поиски в документации matplotlib, - это как писать в файл изображения, а не на экран! К счастью, эта страница объясняет это довольно хорошо: http://www.dalkescientific.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html
источник
Я играл с обоими, и мне нравится Matplotlib намного больше с точки зрения интеграции Python, опций и качества графиков / графиков.
источник
О производительности и построении большого количества точек: я сравнил это с диаграммой рассеяния из 500 000 точек, загруженной из текстового файла и сохраненной в png с помощью gnuplot * и matplotlib.
500.000 points scatterplot gnuplot: 5.171 s matplotlib: 230.693 s
Я запускал его только один раз, и результаты не выглядят одинаковыми, но я думаю, что идея ясна: gnuplot выигрывает по производительности.
* Я использовал gnuplot напрямую, так как демонстрация gnuplotpy не работает для меня из коробки. Matplotlib выигрывает при интеграции с Python.
источник
То, что может делать Gnuplot, может и Gnuplot-Py. Потому что Gnuplot может управляться конвейером (pgnuplot). Gnuplot-Py - всего лишь тонкий слой для этого. Так что не беспокойтесь об этом.
Почему я предпочитаю gnuplot, возможно, многие форматы вывода (PDF, PS и LaTex) очень полезны в документах, а вывод по умолчанию выглядит более научным :)
источник
Некоторые
gnuplot
преимущества (мне все еще не нравится matlibplot после многих лет использования):sin(x)
(нет необходимости определять массивы и думать о диапазонах)"<echo 1 2 3"
)gplot.py - это еще одна оболочка-обертка gnuplot для python и jupyter.
источник