gnuplot vs Matplotlib


84

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

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

  • gnuplotには大量のドキュメントがありますが、gnuplot-pyにはありません。Matplotlibのドキュメントコミュニティはどれくらい良いですか?
  • gnuplotでできることはありますが、gnuplot-pyではできませんか?
  • Matplotlibはより良いPythonサポートを持っていますか?
  • どちらにも大きなショーストップバグはありますか?迷惑?
  • 現在、gnuplotは数十万のポイントをグラフ化しています。これを数百万にスケールアップすることを計画しています。問題が発生する可能性がありますか?Matplotlibはこれをどの程度うまく処理しますか?
  • 使いやすさ、gnuplotとMatplotlibのターンアラウンドタイム?
  • 既存のgnuplot-pyコードをMatplotlibに移植するのはどれほど簡単でしょうか?

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


もう1つのgnuplotラッパーはgplot.pyで、これはjupyterでも機能します
フリードリッヒ

回答:


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

3
gnuplotについて言える唯一のプラスは、matplotlibには3Dプロット機能がないということです。それに加えて、私は両方のprefermatplotlibをはるかに使用しました。
physicsmichael 2009年

1
@ vgm64:現在のSVNには3Dが追加されています。私はそれを自分でテストしたことがないので、どれほど素晴らしいかは言えません。3Dプロットの場合、mayavi2を使用します:code.enthought.com/projects/mayavi
Autoplectic 2009年

10
matplotlibに3Dツールキット
キット

9
「MatplotlibはPython用に作成され、特別に設計されています」-私は反対しなければなりません。matplotlib APIは、「典型的なpython」とはかけ離れているため、問題があります。どちらかといえば、MATLABのセマンティクスを模倣しています。
Ole

6
偏った。あなたは「gnuplot-pyの経験はほとんどありません」でした。提供される情報はすべてmatplotlibに関するものです。matplotlibに関する表現も主観的すぎます。
イカ

46

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

7
さらに、プロットの品質の観点から誰かがデフォルトのスタイルを使用しない場合でも同等であると付け加えておきます。さらに、gnuplotPythonを実行しなくても簡単に呼び出すことができるため、言語に依存しません。
atcold 2014

23

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

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


16

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


10
私はgnuplotの80年代に見える出力(GPUplotではなくgnuplotと綴られている)について意見を異にする必要があります。いくつかのカスタムスタイルを使用する場合(一度だけ定義する必要があります)、美しいプロットになります。他の人がこの素晴らしいソフトウェアをどのように使用しているかを確認してください(リファレンス)。
atcold 2014

8

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


6

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

500.000 points scatterplot
gnuplot:      5.171 s
matplotlib: 230.693 s

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

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


4

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

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


3

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

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

gplot.pyは、Pythonとjupyter用のもう1つのラッパーgnuplotラッパーです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.