90

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に移植するのはどれほど簡単でしょうか?

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

4

8 に答える 8

54
  • matplotlibのドキュメントを自分で確認できます。私はそれが非常に包括的だと思います。
  • 私はgnuplot-pyの経験がほとんどないので、gnuplotができることをすべて実行できるかどうかはわかりません。
  • Matplotlibは、Python専用に記述および設計されているため、Pythonイディオムなどに非常によく適合します。
  • Matplotlibは成熟したプロジェクトです。NASAはそれをいくつかの目的に使用しています。
  • Matplotlibで数千万のポイントをプロットしましたが、それでも美しく見え、すばやく応答しました。
  • Matplotlibを使用するオブジェクト指向の方法を超えて、MATLABと同じくらい簡単にプロットできるpylabインターフェイスがあります。つまり、非常に簡単です。
  • gnuplot-pyからmatplotlibへの移植についてはわかりません。
于 2009-05-26T17:12:05.803 に答える
49

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()
于 2014-05-27T07:21:57.490 に答える
24

matplotlibかなり良いドキュメントがあり、かなり安定しているようです。それが生み出すプロットは美しい-確かに「出版品質」。優れたドキュメントとオンラインで入手できるサンプルコードの量により、習得と使用が簡単であり、コードをそれに変換するのにそれほど問題はないと思いますgnuplot。結局のところ、matplotlibは、データをプロットしてレポートを作成するために科学者によって使用されているため、必要なものがすべて含まれています。

matplotlibの顕著な利点の1つは、Python GUI(少なくともwxPythonPyQt )と統合して、優れたプロットを備えたGUIアプリケーションを作成できることです。

于 2009-05-26T17:09:47.540 に答える
18

GNUplotを(私自身のPythonラッパーで)長い間使用した後(そして80年代に見える出力は本当に好きではありませんでした)、私はちょうどmatplotlibを見始めました。私はそれがとても好きだと言わなければなりません、出力は本当に素晴らしく見えます、そしてドキュメントは高品質で広範囲です(それはGNUplotにも当てはまりますが)。matplotlibのドキュメントで何年もかけて探していたのは、画面ではなく画像ファイルに書き込む方法です。幸いなことに、このページはそれをかなりよく説明しています:http ://www.dalkescientific.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html

于 2009-12-25T10:01:31.897 に答える
8

私は両方で遊んだことがありますが、Pythonの統合、オプション、グラフ/プロットの品質の点でMatplotlibの方がはるかに好きです。

于 2009-05-26T17:15:51.020 に答える
8

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

500.000 points scatterplot
gnuplot:      5.171 s
matplotlib: 230.693 s

一度だけ実行したところ、結果は同じではありませんが、アイデアは明らかだと思います。gnuplotがパフォーマンスで勝ちます。

* gnuplotpyのデモはそのままでは機能しないため、gnuplotを直接使用しました。MatplotlibはPython統合で勝ちます。

于 2015-01-10T21:26:25.227 に答える
4

GnuplotができることGnuplot-Pyもできること。gnuplotはpipe(pgnuplot)で駆動できるからです。Gnuplot-Pyはそれのための単なる薄い層です。だからあなたはそれについて心配する必要はありません。

なぜ私がgnuplotを好むのか、おそらく多くの出力形式(PDF、PS、LaTex)であり、これは論文で非常に役立ち、デフォルトの出力はより科学的なスタイルに見えます:)

于 2013-03-02T14:29:39.157 に答える
4

のいくつかのプロgnuplot(私は何年も使用した後もまだmatlibplotが好きではありません):

  • 単純に関数をプロットsin(x)します(配列を定義して範囲について考える必要はありません)
  • ファイルを直接プロットします(配列にインポートする必要はありません)
  • パイプデータをプロットします(シェルコマンドをその場で実行します"<echo 1 2 3"
  • クリップボードにコピーボタン
  • より高速なプロット
  • より高速なコーディング
  • 覚えやすいキーワード

gplot.pyは、Pythonとjupyter用の別のラッパーgnuplotラッパーです。

于 2020-02-24T21:40:15.057 に答える