Matplotlib = 사용 용이성, Gnuplot = (약간 더 좋음) 성능
나는이 게시물이 오래되었고 답변을 받았지만 지나가고 있었고 2 센트를 넣고 싶었습니다. 내 결론은 다음과 같습니다. 그렇게 크지 않은 데이터 세트가있는 경우 Matplotlib를 사용해야합니다. 더 쉽고 좋아 보입니다. 그러나 실제로 성능 이 필요한 경우 Gnuplot을 사용할 수 있습니다. 나는 당신의 컴퓨터에서 그것을 테스트하고 그것이 실제적인 차이를 만드는지 직접 확인하기 위해 몇 가지 코드를 추가했습니다 (이것은 실제 성능 벤치 마크는 아니지만 첫 번째 아이디어를 제공해야합니다).
다음 그래프는 다음 작업에 필요한 시간 (초)을 나타냅니다.
- 무작위 산포 그래프 플로팅
- 그래프를 png 파일로 저장
구성 :
- gnuplot : 5.2.2
- gnuplot-py : 1.8
- matplotlib : 2.1.2
이전 버전의 라이브러리가있는 구형 컴퓨터에서 실행할 때 성능 차이가 훨씬 더 넓다는 것을 기억합니다 (큰 산점도의 경우 최대 30 초 차이).
또한 주석에서 언급했듯이 동일한 품질의 플롯을 얻을 수 있습니다. 그러나 Gnuplot을 사용하려면 더 많은 땀을 흘려야합니다.
다음 은 컴퓨터에서 시도해보고 싶은 경우 그래프를 생성하는 코드 입니다.
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
g = Gnuplot.Gnuplot()
g("set terminal png size 640,480")
plt.clf()
for idx, val in enumerate(numberOfPoints):
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()
x = np.random.randint(sys.maxint, size=val)
y = np.random.randint(sys.maxint, size=val)
gdata = zip(x,y)
start = timer()
mPlotAndSave(x, y)
end = timer()
matplotlibTime.append(end - start)
start = timer()
gPlotAndSave(gdata, g)
end = timer()
gnuplotTime.append(end - start)
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()