gnuplot проти Matplotlib


84

Я розпочав проект, який графікує журнали Tomcat за допомогою gnuplot-py , зокрема, співвідносячи певні запити з виділенням пам'яті та збиранням сміття. Яка колективна мудрість щодо gnuplot-py проти Matplotlib для графіки Python. Чи є там кращі графічні бібліотеки, про які я не чув?

Мої загальні міркування:

  • Хоча gnuplot має велику кількість документації, gnuplot-py - ні. Наскільки хороша спільнота документації для Matplotlib?
  • Чи є речі, які gnuplot може зробити, а gnuplot-py - ні?
  • Чи має Matplotlib кращу підтримку Python?
  • Чи є великі шоу, що зупиняють помилки в обох? Досади?
  • На даний момент gnuplot зображує 100 000 очок, я планую масштабувати це до мільйонів. Чи слід очікувати проблем? Наскільки добре Matplotlib справляється з цим?
  • Простота у використанні, час опрацювання gnuplot проти Matplotlib?
  • Наскільки просто було б перенести існуючий код gnuplot-py на Matplotlib?

Як би ви підійшли до цього завдання?


Ще однією обгорткою gnuplot є gplot.py, яка також працює в jupyter .
Фрідріх

Відповіді:


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

3
Єдиним плюсом, який я можу сказати щодо gnuplot, є те, що matplotlib не має можливостей 3D-побудови графіків. Крім того, я використовував обидва переважні matplotlib.
physicsmichael

1
@ vgm64: до поточного SVN додано 3d. Я сам нічого не тестував, тому не можу сказати, наскільки це приємно. для тривимірного складання я використовую mayavi2: code.enthought.com/projects/mayavi .
Autoplectic

10
matplotlib тепер має набір інструментів 3D
Kit

9
"Matplotlib написаний і розроблений спеціально для Python" - я повинен не погодитися. API matplotlib настільки далекий від `` типового пітона '', що боляче. Якщо щось, то імітує семантику matlab.
Оле

6
Упереджений. у вас був "дуже невеликий досвід роботи з gnuplot-py". Надана інформація стосується matplotlib. Висловлювання щодо матплотлібу також надто суб'єктивні.
кальмар

46

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

7
Більше того, я хотів би додати, що з точки зору якості сюжету вони рівнозначні, якщо хтось не просто відповідає стилям за замовчуванням. Більше того, gnuplot можна легко викликати без необхідності запускати Python , тому він не залежить від мови!
Atcold

23

matplotlibмає досить хорошу документацію і, здається, досить стабільний. Сюжети, які вона виробляє, прекрасні - точно "якість публікацій". Завдяки хорошій документації та кількості прикладного коду, доступного в Інтернеті, його легко вивчити та використовувати, і я не думаю, що у вас виникнуть великі проблеми з перекладом gnuplotкоду на нього. Зрештою, matplotlib використовується вченими для побудови даних та підготовки звітів - отже, він включає все, що потрібно.

Однією з помітних переваг matplotlib є те, що ви можете інтегрувати його з графічними інтерфейсами Python ( принаймні, wxPython та PyQt ) і створювати графічний додаток з приємними графіками.


16

Після довгого використання GNUplot (з моєю власною обгорткою Python) (і справді не сподобався результат 80-х років), я просто почав розглядати matplotlib. Потрібно сказати, мені це дуже подобається, результат виглядає дуже приємно, а документи якісні та обширні (хоча це стосується і GNUplot). Єдине, що я цілий вік шукав у документах matplotlib - це те, як писати у файл зображення, а не на екран! На щастя, ця сторінка це досить добре пояснює: http://www.dalkesciaching.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html


10
Я повинен не погодитися з результатами 80-х років gnuplot (який пишеться gnuplot, а не GPUplot ). Якщо ви використовуєте деякі власні стилі (їх потрібно визначити лише один раз), у вас вийде чудовий сюжет. Просто перевірте, як інші користуються цим дивовижним програмним забезпеченням ( посилання ).
Atcold

8

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


6

Щодо продуктивності та побудови великої кількості балів: я порівняв це для діаграми розсіювання 500 000 точок, завантажених із текстового файлу та збережених у форматі png, за допомогою gnuplot * та matplotlib.

500.000 points scatterplot
gnuplot:      5.171 s
matplotlib: 230.693 s

Я запустив його лише один раз, і результати виглядають не однаково, але я думаю, що ідея зрозуміла: gnuplot виграє в продуктивності.

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


4

Що може Gnuplot може зробити Gnuplot-Py. Оскільки Gnuplot може рухатися по трубі (pgnuplot). Gnuplot-Py - це просто тонкий шар для нього. Тож вам не потрібно турбуватися з цього приводу.

Чому я віддаю перевагу gnuplot, можливо, багато вихідних форматів (PDF, PS та LaTex), що є дуже корисним у роботах, а вихід за замовчуванням виглядає більш науково-стильовим :)


3

Деякі професіонали gnuplot(я все ще не люблю matlibplot після багатьох років використання):

  • графік функції просто з sin(x)(немає необхідності визначати масиви і думати про діапазонах)
  • будувати файли безпосередньо (не потрібно імпортувати в масив)
  • побудувати конвеєрні дані (виконувати команди оболонки на льоту "<echo 1 2 3")
  • кнопка копіювання в буфер обміну
  • швидше побудова графіків
  • швидше кодування

gplot.py - це ще одна обгортка gnuplot-обгортка для python та jupyter.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.