gnuplot 대 Matplotlib


84

저는 gnuplot-py를 사용하여 Tomcat 로그를 그래프로 표시하는 프로젝트를 시작 했습니다. 특히 특정 요청을 메모리 할당 및 가비지 수집과 연관 시켰습니다 . Python 그래프 작성을 위해 gnuplot-py와 Matplotlib에 대한 집단적 지혜는 무엇입니까? 내가 들어 보지 못한 더 나은 그래프 라이브러리가 있습니까?

내 일반적인 고려 사항은 다음과 같습니다.

  • gnuplot에는 많은 양의 문서가 있지만 gnuplot-py에는 없습니다. Matplotlib의 문서 커뮤니티는 얼마나 좋은가요?
  • gnuplot은 할 수 있지만 gnuplot-py는 할 수없는 일이 있습니까?
  • Matplotlib는 더 나은 Python 지원을 제공합니까?
  • 둘 중 하나에 큰 쇼 중지 버그가 있습니까? 성가신가요?
  • 현재 gnuplot은 100,000 개의 포인트를 그래프로 표시하고 있으며이를 수백만 개까지 확장 할 계획입니다. 문제를 예상해야합니까? Matplotlib는 이것을 얼마나 잘 처리합니까?
  • 사용 편의성, gnuplot 대 Matplotlib의 처리 시간?
  • 기존 gnuplot-py 코드를 Matplotlib로 이식하는 것이 얼마나 쉬울까요?

이 작업에 어떻게 접근 하시겠습니까?


또 다른 gnuplot 래퍼는 jupyter 에서도 작동하는 gplot.py 입니다.
프리드리히

답변:


51
  • matplotlib의 문서를 직접 확인할 수 있습니다 . 나는 그것이 매우 포괄적이라고 생각합니다.
  • 나는 gnuplot-py에 대한 경험이 거의 없기 때문에 모든 gnuplot이 할 수 있는지 여부를 말할 수 없습니다.
  • Matplotlib는 Python을 위해 특별히 작성되고 설계되었으므로 Python 관용구 등에 매우 잘 맞습니다.
  • Matplotlib는 성숙한 프로젝트입니다. NASA는 그것을 몇 가지 용도로 사용합니다.
  • Matplotlib에서 수천만 개의 포인트를 플로팅했지만 여전히 아름답게 보였고 빠르게 반응했습니다.
  • Matplotlib를 사용하는 객체 지향적 인 방법을 넘어선 pylab 인터페이스가있어 MATLAB 에서처럼 쉽게 플로팅 할 수 있습니다. 즉, 매우 쉽습니다.
  • gnuplot-py에서 matplotlib로 이식하는 것에 관해서는 모르겠습니다.

3
gnuplot에 대해 말할 수있는 유일한 장점은 matplotlib에 3D 플로팅 기능이 없다는 것입니다. 그 외에도 나는 선호하는 matplotlib를 모두 사용했습니다.
physicsmichael

1
@ vgm64 : 현재 SVN에 3d가 다시 추가되었습니다. 직접 테스트하지 않았기 때문에 얼마나 좋은지 말할 수 없습니다. 3d 플로팅의 경우 mayavi2 : code.enthought.com/projects/mayavi를 사용 합니다.
Autoplectic

10
matplotlib에는 이제 3D 툴킷이 있습니다
Kit

9
"Matplotlib는 특별히 Python 용으로 작성되고 설계되었습니다."-동의하지 않습니다. matplotlib API는 '전형적인 파이썬'과는 거리가 멀어 아프다. 무엇이든 그것은 matlab 의미론을 모방합니다.
Ole

6
치우친. "gnuplot-py에 대한 경험이 거의 없었습니다". 제공된 정보는 모두 matplotlib에 관한 것입니다. matplotlib에 대한 표현도 너무 주관적입니다.
squid

46

Matplotlib = 사용 용이성, Gnuplot = (약간 더 좋음) 성능


나는이 게시물이 오래되었고 답변을 받았지만 지나가고 있었고 2 센트를 넣고 싶었습니다. 내 결론은 다음과 같습니다. 그렇게 크지 않은 데이터 세트가있는 경우 Matplotlib를 사용해야합니다. 더 쉽고 좋아 보입니다. 그러나 실제로 성능 필요한 경우 Gnuplot을 사용할 수 있습니다. 나는 당신의 컴퓨터에서 그것을 테스트하고 그것이 실제적인 차이를 만드는지 직접 확인하기 위해 몇 가지 코드를 추가했습니다 (이것은 실제 성능 벤치 마크는 아니지만 첫 번째 아이디어를 제공해야합니다).

다음 그래프는 다음 작업에 필요한 시간 (초)을 나타냅니다.

  • 무작위 산포 그래프 플로팅
  • 그래프를 png 파일로 저장

Gnuplot VS Matplotlib

구성 :

  • 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
또한 플롯 품질 측면에서 누군가가 기본 스타일을 사용하지 않는 경우 동등하다고 덧붙이고 싶습니다 . 또한 gnuplotPython 을 실행하지 않고도 쉽게 호출 할 수 있으므로 언어 독립적입니다!
Atcold 2014-08-12

23

matplotlib꽤 좋은 문서를 가지고 있고 꽤 안정적인 것 같습니다. 그것이 생산하는 플롯은 아름답습니다. "출판 품질"은 확실합니다. 좋은 문서와 온라인에서 사용할 수있는 예제 코드의 양으로 인해 배우고 사용하기 쉽고 gnuplot코드를 번역하는 데 많은 어려움이 없을 것이라고 생각 합니다. 결국 matplotlib는 과학자들이 데이터를 플로팅하고 보고서를 준비하는 데 사용되므로 필요한 모든 것이 포함됩니다.

matplotlib의 두드러진 장점 중 하나는 Python GUI ( 적어도 wxPythonPyQt )와 통합하고 멋진 플롯으로 GUI 애플리케이션을 만들 수 있다는 것입니다.


16

GNUplot (내 자신의 Python 래퍼 포함)을 오랫동안 사용한 후 (그리고 실제로 80 년대의 출력을 좋아하지 않음), 방금 matplotlib를 살펴보기 시작했습니다. 나는 그것을 매우 좋아한다고 말해야한다. 출력은 정말 멋져 보이고 문서는 고품질이고 광범위하다 (그것도 GNUplot에도 적용된다). matplotlib 문서에서 오랜 세월 동안 찾던 한 가지는 화면이 아닌 이미지 파일에 쓰는 방법입니다! 다행스럽게도이 페이지는 잘 설명합니다 : http://www.dalkescientific.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html


10
gnuplot 의 80 년대와 같은 출력에 대해 동의하지 않습니다 ( GPUplot이 아니라 gnuplot 으로 표기 ). 일부 사용자 지정 스타일을 사용하는 경우 (한 번만 정의하면 됨) 아름다운 플롯으로 끝납니다. 다른 사람들이이 놀라운 소프트웨어를 어떻게 사용하고 있는지 확인하십시오 ( 참조 ).
Atcold

8

나는 둘 다 가지고 놀았으며 Python 통합, 옵션 및 그래프 / 플롯의 품질 측면에서 Matplotlib를 훨씬 더 좋아합니다.


6

성능 및 많은 수의 포인트 플로팅 정보 : gnuplot * 및 matplotlib를 사용하여 텍스트 파일에서로드하고 png에 저장 한 500.000 포인트의 산점도를 비교했습니다.

500.000 points scatterplot
gnuplot:      5.171 s
matplotlib: 230.693 s

한 번만 실행했는데 결과가 똑같아 보이지는 않지만 아이디어는 분명하다고 생각합니다. gnuplot이 성능면에서 승리합니다.

* gnuplotpy 데모가 기본적으로 작동하지 않기 때문에 gnuplot을 직접 사용했습니다. 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 는 python 및 jupyter를위한 또 다른 래퍼 gnuplot 래퍼입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.