私は Tomcatgnuplot-py を使用してログをグラフ化するプロジェクトを開始しました。具体的には、特定のリクエストをメモリ割り当てとガベージコレクションに関連付けます。 gnuplot-py vs Matplotlib for Python graphing。聞いたことのない、より良いグラフ化ライブラリがありますか?
私の一般的な考慮事項は次のとおりです。
このタスクにどのようにアプローチしますか?
私はこの投稿が古くて答えていることを知っていますが、私は通り過ぎていて、2セントを入れたかったのです。ここに私の結論があります。それほど大きくないデータセットがある場合は、Matplotlibを使用する必要があります。簡単で見た目も良いです。ただし、実際にパフォーマンスが必要な場合は、Gnuplotを使用できます。マシン上でテストするためのコードを追加し、実際に違いが生じるかどうかを確認しました(これは実際のパフォーマンスベンチマークではありませんが、最初のアイデアが必要です)。
次のグラフは、以下に必要な時間(秒単位)を表しています。
構成:
古いバージョンのライブラリを使用する古いコンピューターで実行すると、パフォーマンスのギャップがはるかに大きくなることを覚えています(大きな散布図の場合、最大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の顕著な利点の1つは、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
私は両方で遊んでいますが、Matplotlibの方がPython統合、オプション、グラフ/プロットの品質という点ではるかに優れています。
パフォーマンスと多数のポイントのプロットについて:gnuplot *とmatplotlibを使用して、テキストファイルから読み込まれ、pngに保存された500.000ポイントの散布図と比較しました。
500.000 points scatterplot
gnuplot: 5.171 s
matplotlib: 230.693 s
一度だけ実行した結果は同じようには見えませんが、考えは明確だと思います:gnuplotはパフォーマンスで勝ちます。
* gnuplotpyデモはすぐに使用できないため、gnuplotを直接使用しました。 Matplotlibは、Python integration。
GnuplotでできることGnuplot-Pyでもできること。 Gnuplotはpipe(pgnuplot)で駆動できるためです。 Gnuplot-Pyはそのための薄い層です。そのため、心配する必要はありません。
私がgnuplotを好む理由は多分多くの出力形式(PDF、PS、LaTex)で、これは論文で非常に有用であり、デフォルトの出力はより科学的なスタイルに見えます:)