gnuplot vs Matplotlib

84

Zacząłem od projektu graficznego dla logów Tomcat przy użyciu gnuplot-py , w szczególności korelując poszczególne żądania z alokacją pamięci i czyszczeniem pamięci. Jaka jest zbiorowa mądrość na temat gnuplot-py vs Matplotlib for Python graphing. Czy istnieją lepsze biblioteki graficzne, o których nie słyszałem?

Moje ogólne uwagi są następujące:

  • Podczas gdy gnuplot ma dużą ilość dokumentacji, gnuplot-py nie. Jak dobra jest społeczność dokumentacji dla Matplotlib?
  • Czy są rzeczy, które gnuplot może zrobić, ale gnuplot-py nie może?
  • Czy Matplotlib ma lepszą obsługę Pythona?
  • Czy w którymś z nich są duże programy zatrzymujące błędy? Irytacje?
  • Obecnie gnuplot tworzy wykresy 100 000 punktów, planuję zwiększyć to do milionów. Czy powinienem spodziewać się problemów? Jak dobrze radzi sobie z tym Matplotlib?
  • Łatwość obsługi, czas realizacji dla gnuplot vs Matplotlib?
  • Jak łatwo byłoby przenieść istniejący kod gnuplot-py do Matplotlib?

Jak podszedłbyś do tego zadania?

Ethan Heilman
źródło
Innym opakowaniem gnuplot jest gplot.py, który działa również w jupyter .
Friedrich

Odpowiedzi:

51
  • Możesz samodzielnie sprawdzić dokumentację matplotlib . Uważam, że jest to dość obszerne.
  • Mam bardzo małe doświadczenie z gnuplot-py, więc nie mogę powiedzieć, czy potrafi wszystko, co potrafi gnuplot.
  • Matplotlib jest napisany i zaprojektowany specjalnie dla Pythona, więc bardzo dobrze pasuje do idiomów Pythona i tym podobnych.
  • Matplotlib to dojrzały projekt. NASA używa go do pewnych rzeczy.
  • W Matplotlib narysowałem dziesiątki milionów punktów, a mimo to wyglądał pięknie i szybko reagował.
  • Poza obiektowym sposobem korzystania z Matplotlib jest interfejs pylab, który sprawia, że ​​kreślenie jest tak łatwe, jak w MATLAB - czyli bardzo łatwe.
  • Co do przeniesienia z gnuplot-py do matplotlib, nie mam pojęcia.
Autoplektyczne
źródło
3
Jedynym plusem, jaki mogę powiedzieć o gnuplot, jest to, że matplotlib nie ma możliwości drukowania 3D. Poza tym zdecydowanie korzystałem z obu preferowanych bibliotek matplotlib.
physicsmichael
1
@ vgm64: obecne SVN ma dodane z powrotem 3d. Sam nie testowałem żadnego z nich, więc nie mogę powiedzieć, jakie to fajne. do drukowania 3d używam mayavi2: code.enthought.com/projects/mayavi .
Autoplectic
10
matplotlib ma teraz zestaw narzędzi 3D
zestaw
9
„Matplotlib jest napisany i zaprojektowany specjalnie dla Pythona” - nie zgadzam się. Matplotlib API jest tak dalekie od „typowego Pythona”, że boli. Jeśli już, naśladuje semantykę języka Matlab.
Ole
6
Stronniczy. miałeś „bardzo małe doświadczenie z gnuplot-py”. Podane informacje dotyczą matplotlib. Wypowiedź na temat matplotlib jest również zbyt subiektywna.
kałamarnica
46

Matplotlib = łatwość użycia, Gnuplot = (nieco lepsza) wydajność


Wiem, że ten post jest stary i odpowiedziałem, ale przechodziłem obok i chciałem włożyć swoje dwa centy. Oto mój wniosek: jeśli masz niezbyt duży zestaw danych, powinieneś użyć Matplotlib. Jest łatwiejsze i lepiej wygląda. Jeśli jednak naprawdę potrzebujesz wydajności, możesz użyć Gnuplot. Dodałem trochę kodu, aby przetestować go na twoim komputerze i przekonać się, czy robi to prawdziwą różnicę (nie jest to prawdziwy test wydajności, ale powinien dać pierwszy pomysł).

Poniższy wykres przedstawia wymagany czas (w sekundach) do:

  • Sporządzić losowy wykres rozrzutu
  • Zapisz wykres do pliku png

Gnuplot VS Matplotlib

Konfiguracja:

  • gnuplot: 5.2.2
  • gnuplot-py: 1.8
  • matplotlib: 2.1.2

Pamiętam, że różnica w wydajności jest znacznie większa podczas pracy na starszym komputerze ze starszymi wersjami bibliotek (różnica ~ 30 sekund w przypadku dużego wykresu punktowego).

Ponadto, jak wspomniano w komentarzach, można uzyskać podobną jakość działek. Ale będziesz musiał włożyć więcej potu, aby zrobić to z Gnuplot.


Oto kod do wygenerowania wykresu, jeśli chcesz wypróbować go na swoim komputerze:

# -*- 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()
7hibault
źródło
7
Ponadto dodam, że jeśli chodzi o jakość fabuły, są one równoważne, jeśli ktoś nie wybiera po prostu domyślnych stylów. Co więcej, gnuplot można łatwo wywołać bez konieczności uruchamiania Pythona , więc jest niezależny od języka!
Atcold
23

matplotlibma całkiem dobrą dokumentację i wydaje się być całkiem stabilny. Działki, które produkuje są piękne - na pewno „jakość wydawnicza”. Ze względu na dobrą dokumentację i ilość przykładowego kodu dostępnego online, jest łatwy do nauczenia i używania, i nie sądzę, żebyś miał dużo problemów z przetłumaczeniem gnuplotna niego kodu. W końcu matplotlib jest używany przez naukowców do wykreślania danych i przygotowywania raportów - więc zawiera wszystko, czego potrzeba.

Jedną z istotnych zalet matplotlib jest to, że można go zintegrować z interfejsami GUI Pythona ( przynajmniej wxPython i PyQt ) i tworzyć aplikacje GUI z ładnymi wykresami.

Eli Bendersky
źródło
16

Po długim używaniu GNUplot (z moim własnym opakowaniem Pythona) (i naprawdę nie lubię wyjścia wyglądającego na lata 80.), właśnie zacząłem przyglądać się matplotlib. Muszę powiedzieć, że bardzo mi się podoba, wynik wygląda naprawdę ładnie, a dokumentacja jest wysokiej jakości i obszerna (chociaż dotyczy to również GNUplot). Jedyną rzeczą, której szukałem od lat w dokumentach matplotlib, jest to, jak pisać do pliku obrazu, a nie do ekranu! Na szczęście ta strona wyjaśnia to całkiem dobrze: http://www.dalkescientific.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html

Wim
źródło
10
Muszę się nie zgodzić co do wyników gnuplot wyglądających na lata 80. (zapisywane jako gnuplot, a nie GPUplot ). Jeśli użyjesz niestandardowych stylów (musisz je zdefiniować tylko raz), otrzymasz piękną fabułę. Sprawdź, jak inni używają tego niesamowitego oprogramowania ( odniesienie ).
Atcold
8

Bawiłem się obydwoma i znacznie bardziej podoba mi się Matplotlib pod względem integracji z Pythonem, opcji i jakości wykresów / wykresów.

Corey Goldberg
źródło
6

O wydajności i wykreślaniu dużej liczby punktów: porównałem to z wykresem rozrzutu zawierającym 500 000 punktów załadowanym z pliku tekstowego i zapisanym w formacie png przy użyciu gnuplot * i matplotlib.

500.000 points scatterplot
gnuplot:      5.171 s
matplotlib: 230.693 s

Uruchomiłem go tylko raz i wyniki nie wyglądają identycznie, ale myślę, że idea jest jasna: gnuplot wygrywa na wydajności.

* Użyłem gnuplot bezpośrednio, ponieważ demo gnuplotpy nie działa dla mnie od razu po wyjęciu z pudełka. Matplotlib wygrywa w integracji z Pythonem.

znak
źródło
4

Co potrafi Gnuplot Gnuplot-Py też potrafi. Ponieważ Gnuplot może być sterowany przez potok (pgnuplot). Gnuplot-Py to po prostu cienka warstwa. Więc nie musisz się tym martwić.

Dlaczego wolę gnuplot, może wiele formatów wyjściowych (PDF, PS i LaTex), co jest bardzo przydatne w artykułach, a domyślny wynik wygląda bardziej naukowo :)

joseph.smeng
źródło
3

Niektóre pro gnuplot(nadal nie lubię matlibplot po latach użytkowania):

  • funkcja plot po prostu z sin(x)(nie ma potrzeby definiowania tablic i myślenia o zakresach)
  • drukowanie plików bezpośrednio (nie ma potrzeby importowania do tablicy)
  • plot potokowe dane (wykonuj polecenia powłoki w locie "<echo 1 2 3")
  • przycisk kopiowania do schowka
  • szybsze kreślenie
  • szybsze kodowanie

gplot.py to kolejny wrapper gnuplot wrapper dla Pythona i Jupytera.

Friedrich
źródło