Вопрос

Я начал над проектом построения графиков Кот журналы , использующие 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 VS Matplotlib

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

  • 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top