gnuplot против Matplotlib
-
06-09-2019 - |
Вопрос
Я начал над проектом построения графиков Кот журналы , использующие gnuplot-пи, в частности, соотнося конкретные запросы с выделением памяти и сборкой мусора.Что такое коллективная мудрость gnuplot-py vs Matplotlib - Файл для построения графиков на Python.Есть ли лучшие графические библиотеки, о которых я не слышал?
Мои общие соображения таковы:
- В то время как gnuplot имеет большое количество документации, gnuplot-py этого не делает.Насколько хорошо сообщество документации для Matplotlib?
- Есть ли вещи, которые gnuplot может делать, но gnuplot-py не может?
- Имеет ли Matplotlib лучшую поддержку Python?
- Есть ли в любом из них большие ошибки, останавливающие шоу?Раздражения?
- В настоящее время gnuplot отображает 100 000 точек, я планирую увеличить это до миллионов.Должен ли я ожидать проблем?Насколько хорошо Matplotlib справляется с этим?
- Простота использования, время выполнения для gnuplot против Matplotlib?
- Насколько легко было бы перенести существующий код gnuplot-py в Matplotlib?
Как бы вы подошли к этой задаче?
Решение
- Вы можете проверить документация matplotlib по 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-пи: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, по крайней мере) и создать графическое приложение с приятными графиками.
После долгого использования GNUplot (с моей собственной оболочкой Python) (и мне действительно не нравился результат, похожий на 80-е), я только начал просматривать matplotlib.Я должен сказать, что мне это очень нравится, выходные данные выглядят действительно красиво, а документы высококачественные и обширные (хотя это касается и GNUplot).Единственное, что я целую вечность искал в документах matplotlib, - это как записывать в файл изображения, а не на экран!К счастью, эта страница объясняет это довольно хорошо: http://www.dalkescientific.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html
Я играл с обоими, и мне намного больше нравится Matplotlib с точки зрения интеграции Python, опций и качества графиков.
Что может сделать Gnuplot, Gnuplot-Py тоже может сделать.Потому что Gnuplot может управляться с помощью pipe (pgnuplot).Gnuplot-Py - это всего лишь тонкий слой для этого.Так что вам не нужно беспокоиться об этом.
Почему я предпочитаю gnuplot, возможно, формат вывода many (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.