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()