저는 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로 이식하는 것이 얼마나 쉬울까요?
이 작업에 어떻게 접근 하시겠습니까?
답변
- matplotlib의 문서를 직접 확인할 수 있습니다 . 나는 그것이 매우 포괄적이라고 생각합니다.
- 나는 gnuplot-py에 대한 경험이 거의 없기 때문에 모든 gnuplot이 할 수 있는지 여부를 말할 수 없습니다.
- Matplotlib는 Python을 위해 특별히 작성되고 설계되었으므로 Python 관용구 등에 매우 잘 맞습니다.
- Matplotlib는 성숙한 프로젝트입니다. NASA는 그것을 몇 가지 용도로 사용합니다.
- Matplotlib에서 수천만 개의 포인트를 플로팅했지만 여전히 아름답게 보였고 빠르게 반응했습니다.
- Matplotlib를 사용하는 객체 지향적 인 방법을 넘어선 pylab 인터페이스가있어 MATLAB 에서처럼 쉽게 플로팅 할 수 있습니다. 즉, 매우 쉽습니다.
- gnuplot-py에서 matplotlib로 이식하는 것에 관해서는 모르겠습니다.
답변
Matplotlib = 사용 용이성, Gnuplot = (약간 더 좋음) 성능
나는이 게시물이 오래되었고 답변을 받았지만 지나가고 있었고 2 센트를 넣고 싶었습니다. 내 결론은 다음과 같습니다. 그렇게 크지 않은 데이터 세트가있는 경우 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()
답변
matplotlib
꽤 좋은 문서를 가지고 있고 꽤 안정적인 것 같습니다. 그것이 생산하는 플롯은 아름답습니다. “출판 품질”은 확실합니다. 좋은 문서와 온라인에서 사용할 수있는 예제 코드의 양으로 인해 배우고 사용하기 쉽고 gnuplot
코드를 번역하는 데 많은 어려움이 없을 것이라고 생각 합니다. 결국 matplotlib는 과학자들이 데이터를 플로팅하고 보고서를 준비하는 데 사용되므로 필요한 모든 것이 포함됩니다.
matplotlib의 두드러진 장점 중 하나는 Python GUI ( 적어도 wxPython 및 PyQt )와 통합하고 멋진 플롯으로 GUI 애플리케이션을 만들 수 있다는 것입니다.
답변
GNUplot (내 자신의 Python 래퍼 포함)을 오랫동안 사용한 후 (그리고 실제로 80 년대의 출력을 좋아하지 않음), 방금 matplotlib를 살펴보기 시작했습니다. 나는 그것을 매우 좋아한다고 말해야한다. 출력은 정말 멋져 보이고 문서는 고품질이고 광범위하다 (그것도 GNUplot에도 적용된다). matplotlib 문서에서 오랜 세월 동안 찾던 한 가지는 화면이 아닌 이미지 파일에 쓰는 방법입니다! 다행스럽게도이 페이지는 잘 설명합니다 : http://www.dalkescientific.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html
답변
나는 둘 다 가지고 놀았으며 Python 통합, 옵션 및 그래프 / 플롯의 품질 측면에서 Matplotlib를 훨씬 더 좋아합니다.
답변
성능 및 많은 수의 포인트 플로팅 정보 : gnuplot * 및 matplotlib를 사용하여 텍스트 파일에서로드하고 png에 저장 한 500.000 포인트의 산점도를 비교했습니다.
500.000 points scatterplot
gnuplot: 5.171 s
matplotlib: 230.693 s
한 번만 실행했는데 결과가 똑같아 보이지는 않지만 아이디어는 분명하다고 생각합니다. gnuplot이 성능면에서 승리합니다.
* gnuplotpy 데모가 기본적으로 작동하지 않기 때문에 gnuplot을 직접 사용했습니다. Matplotlib는 Python 통합에서 승리합니다.
답변
Gnuplot이 할 수있는 일 Gnuplot-Py도 할 수 있습니다. Gnuplot은 파이프 (pgnuplot)로 구동 할 수 있기 때문입니다. Gnuplot-Py는 얇은 층일뿐입니다. 그래서 당신은 그것에 대해 걱정할 필요가 없습니다.
gnuplot을 선호하는 이유는 논문에서 매우 유용한 많은 출력 형식 (PDF, PS 및 LaTex) 일 수 있으며 기본 출력은보다 과학적인 스타일로 보입니다. 🙂