문제

프로젝트 그래프를 시작했습니다 수코양이 로그를 사용합니다 gnuplot-py, 특히 특정 요청과 메모리 할당 및 쓰레기 수집과 상관 관계가 있습니다. gnuplot-py vs에 대한 집단적 지혜는 무엇입니까? matplotlib 파이썬 그래프의 경우. 내가 들어 본 적이없는 더 나은 그래프 라이브러리가 있습니까?

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

  • Gnuplot에는 많은 양의 문서가 있지만 Gnuplot-Py는 그렇지 않습니다. Matplotlib의 문서 커뮤니티는 얼마나 좋은가요?
  • gnuplot가 할 수있는 일이 있습니까?
  • matplotlib가 더 나은 파이썬 지지대를 가지고 있습니까?
  • 큰 쇼가 버그를 멈추는 큰 쇼가 있습니까? 성가심?
  • 현재 Gnuplot은 100,000의 포인트를 그래프로 만들고 있습니다. 저는 이것을 수백만까지 확장 할 계획입니다. 문제를 예상해야합니까? matplotlib는 이것을 얼마나 잘 처리합니까?
  • 사용 용이성, GnuPlot 대 Matplotlib의 처리 시간?
  • 기존 Gnuplot-Py 코드를 Matplotlib에 포트하는 것이 얼마나 쉬울까요?

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

도움이 되었습니까?

해결책

  • 당신은 확인할 수 있습니다 matplotlib의 문서 당신 자신. 나는 그것이 매우 포괄적 인 것을 안다.
  • 나는 gnuplot-py에 대한 경험이 거의 없으므로 모든 gnuplot 캔을 할 수 있는지는 말할 수 없습니다.
  • Matplotlib는 Python 용으로 작성되고 특별히 설계되었으므로 Python 관용구 등에 매우 잘 어울립니다.
  • Matplotlib는 성숙한 프로젝트입니다. NASA는 일부 물건에 사용합니다.
  • 나는 matplotlib에서 수천만 포인트를 계획했지만 여전히 아름답게 보였고 빠르게 반응했습니다.
  • Matplotlib를 사용하는 객체 지향적 인 방법 외에는 pylab 인터페이스가 있는데, 이는 Matlab의 플롯을 쉽게 플롯 할 수 있습니다.
  • gnuplot-py에서 matplotlib로의 포팅에 관해서는 전혀 모른다.

다른 팁

matplotlib = 사용 편의성, gnuplot = (약간 더 나은) 성능


나는이 게시물이 오래되고 대답했다는 것을 알고 있지만지나 가서 2 센트를 넣고 싶었습니다. 내 결론은 다음과 같습니다. BIG가 아닌 데이터 세트가있는 경우 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()

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

Matplotlib의 현저한 장점 중 하나는 Python Guis와 통합 할 수 있다는 것입니다.wxpython 그리고 pyqt, 적어도) 좋은 플롯으로 GUI 응용 프로그램을 만듭니다.

gnuplot (내 자신의 파이썬 래퍼와 함께)을 오랫동안 사용한 후 (80 년대의 출력을 좋아하지 않음) Matplotlib를 살펴보기 시작했습니다. 나는 그것을 매우 좋아한다고 말해야합니다. 출력은 정말 멋져 보이고 문서는 고품질과 광범위합니다 (비록 Gnuplot도 마찬가지입니다). Matplotlib 문서에서 나이를 찾은 한 가지는 화면이 아닌 이미지 파일에 쓰는 방법입니다! 운 좋게도이 페이지는 꽤 잘 설명합니다. http://www.dalkescientific.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html

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

Gnuplot가 할 수있는 일이 Gnuplot-Py도 할 수 있습니다. gnuplot은 파이프 (pgnuplot)에 의해 구동 될 수 있기 때문입니다. gnuplot-py는 단지 얇은 층입니다. 따라서 걱정할 필요가 없습니다.

왜 GnuPlot을 선호하는 이유는 아마도 많은 출력 형식 (PDF, PS 및 LATEX)을 선호하며, 이는 논문에 매우 유용하며 기본 출력은 더 과학적 스타일로 보입니다 :)

성능 및 플로팅에 대해 많은 포인트를 플로팅 : 텍스트 파일에서로드 된 500.000 포인트의 산점도와 Gnuplot* 및 Matplotlib를 사용하여 PNG에 저장했습니다.

500.000 points scatterplot
gnuplot:      5.171 s
matplotlib: 230.693 s

나는 그것을 한 번만 달렸고 결과는 동일하게 보이지 않지만 아이디어는 분명하다고 생각합니다. gnuplot은 성능에서 승리합니다.

*gnuplotpy 데모가 나에게 제공되지 않기 때문에 gnuplot을 직접 사용했습니다. Matplotlib는 Python Integration에서 승리합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top