web-dev-qa-db-ja.com

gnuplot vs Matplotlib

私は Tomcatgnuplot-py を使用してログをグラフ化するプロジェクトを開始しました。具体的には、特定のリクエストをメモリ割り当てとガベージコレクションに関連付けます。 gnuplot-py vs Matplotlib for Python graphing。聞いたことのない、より良いグラフ化ライブラリがありますか?

私の一般的な考慮事項は次のとおりです。

  • Gnuplotには大量のドキュメントがありますが、gnuplot-pyにはありません。 Matplotlibのドキュメントコミュニティはどの程度優れていますか?
  • Gnuplotでできることはありますが、gnuplot-pyではできませんか?
  • Matplotlibには、より良いPythonサポートがありますか?
  • どちらにも大きなショーを止めるバグはありますか?迷惑ですか?
  • 現在、gnuplotは100,000のポイントをグラフ化していますが、これを数百万に拡大することを計画しています。問題を予期する必要がありますか? Matplotlibはこれをどの程度うまく処理しますか?
  • 使いやすさ、gnuplot対Matplotlibの所要時間?
  • 既存のgnuplot-pyコードをMatplotlibに移植するのはどれくらい簡単でしょうか?

このタスクにどのようにアプローチしますか?

77
Ethan Heilman
  • matplotlibのドキュメント 自分で確認できます。私はそれが非常に包括的なと思います。
  • 私はgnuplot-pyの経験がほとんどないので、gnuplotができることをすべてできるかどうかは言えません。
  • MatplotlibはPythonで記述され、Python専用に設計されているため、Pythonイディオムなどにぴったりです。
  • Matplotlibは成熟したプロジェクトです。 NASAはそれをいくつかの目的に使用します。
  • Matplotlibで数千万のポイントをプロットしましたが、それでもまだ美しく見え、すぐに反応しました。
  • Matplotlibを使用するオブジェクト指向の方法を超えて、pylabインターフェイスがあります。これにより、MATLABでのプロットと同じくらい簡単に、つまり非常に簡単にプロットできます。
  • Gnuplot-pyからmatplotlibへの移植については、私にはわかりません。
50
Autoplectic

Matplotlib =使いやすさ、Gnuplot =(わずかに優れた)パフォーマンス


私はこの投稿が古くて答えていることを知っていますが、私は通り過ぎていて、2セントを入れたかったのです。ここに私の結論があります。それほど大きくないデータセットがある場合は、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()
42
7hibault

matplotlibにはかなり優れたドキュメントがあり、非常に安定しているようです。それが生み出すプロットは美しい-確かに「出版品質」。優れたドキュメントとオンラインで利用可能なサンプルコードの量により、学習と使用が簡単であり、gnuplotコードの翻訳にそれほど苦労することはないと思います。結局のところ、matplotlibは科学者がデータのプロットとレポートの作成に使用しているため、必要なものがすべて含まれています。

Matplotlibの顕著な利点の1つは、Python GUI(- wxPython および PyQt 、少なくとも)と統合し、GUIアプリケーションを作成できることです。素敵なプロット。

21
Eli Bendersky

GNUplotを(私自身のPython=ラッパーで)長い間(そして実際に80年代風の出力が気に入らない)使用した後、私はmatplotlibを見始めたばかりです。非常に、出力は本当にすてきに見え、ドキュメントは高品質で広範囲に渡っています(ただし、GNUplotでも同様です)。matplotlibドキュメントで長年探していたのは、画面ではなく画像ファイルに書き込む方法です!幸いなことに、このページでは非常によく説明されています。 http://www.dalkescientific.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html

15
Wim

私は両方で遊んでいますが、Matplotlibの方がPython統合、オプション、グラフ/プロットの品質という点ではるかに優れています。

8
Corey Goldberg

パフォーマンスと多数のポイントのプロットについて:gnuplot *とmatplotlibを使用して、テキストファイルから読み込まれ、pngに保存された500.000ポイントの散布図と比較しました。

500.000 points scatterplot
gnuplot:      5.171 s
matplotlib: 230.693 s

一度だけ実行した結果は同じようには見えませんが、考えは明確だと思います:gnuplotはパフォーマンスで勝ちます。

* gnuplotpyデモはすぐに使用できないため、gnuplotを直接使用しました。 Matplotlibは、Python integration。

4
Mark

GnuplotでできることGnuplot-Pyでもできること。 Gnuplotはpipe(pgnuplot)で駆動できるためです。 Gnuplot-Pyはそのための薄い層です。そのため、心配する必要はありません。

私がgnuplotを好む理由は多分多くの出力形式(PDF、PS、LaTex)で、これは論文で非常に有用であり、デフォルトの出力はより科学的なスタイルに見えます:)

4
joseph.smeng