gnuplot和Matplotlib


84

我已经开始使用gnuplot-py绘制Tomcat日志的项目,特别是将特定请求与内存分配和垃圾回收相关联。gnuplot-py和Matplotlib用于Python图形化的集体智慧是什么?我还没有听说过更好的图形库吗?

我的一般考虑是:

  • 尽管gnuplot有大量文档,但gnuplot-py没有。Matplotlib的文档社区有多好?
  • gnuplot是否可以执行某些操作,但是gnuplot-py无法执行?
  • Matplotlib是否有更好的Python支持?
  • 两者中是否都设有大型表演来阻止错误?烦恼?
  • 目前,gnuplot正在绘制100,000个点的图形,我正计划将其扩展到数百万个。我应该期待问题吗?Matplotlib处理得如何?
  • 易于使用,gnuplot与Matplotlib的周转时间如何?
  • 将现有的gnuplot-py代码移植到Matplotlib有多容易?

您将如何处理此任务?


另一个gnuplot包装器是gplot.py,它也可以在jupyter中使用
弗里德里希

Answers:


51
  • 您可以自己查看matplotlib的文档。我觉得它很全面。
  • 我对gnuplot-py的经验很少,所以我不能说gnuplot是否可以完成所有工作。
  • Matplotlib是为Python编写的并且专门为Python设计的,因此非常适合Python习语等。
  • Matplotlib是一个成熟的项目。NASA将其用于某些用途。
  • 我已经在Matplotlib中绘制了数千万个点,它看起来仍然很漂亮并且响应迅速。
  • pylab接口是使用Matplotlib的面向对象方法之外的另一种方法,它使绘制与在MATLAB中一样容易,即非常容易。
  • 至于从gnuplot-py移植到matplotlib,我也不知道。

3
对于gnuplot,我唯一可以说的是matplotlib不具有3D绘图功能。除此之外,到目前为止,我都使用了首选的matplotlib。
PhysicsMichael

1
@ vgm64:当前的SVN重新添加了3d。我自己尚未对其进行任何测试,所以我不能说它有多好。对于3D绘图,我使用mayavi2:code.enthought.com/projects/mayavi
Autoplectic

10
matplotlib现在有一个3D工具包
Kit 2010年

9
“ Matplotlib是为Python编写的,并且是专门为Python设计的”-我不得不不同意。matplotlib API与“典型的python”相距甚远,以至于受到伤害。如果有的话,它会模仿Matlab语义。
Ole

6
有偏见。您“对gnuplot-py的经验很少”。给出的信息全部与matplotlib有关。关于matplotlib的表达也太主观。
鱿鱼2015年

46

Matplotlib =易于使用,Gnuplot =(稍微好一点)性能


我知道这个帖子很旧并且可以回答,但是我路过了,想放两分钱。这是我的结论:如果您的数据集不是那么大,则应使用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
而且,我要补充一点,就情节质量而言,如果有人不只是使用默认样式,它们是等效的。而且,无需运行Python即可轻松调用gnuplot,因此它是语言无关的!
Atcold

23

matplotlib有相当不错的文档,而且似乎很稳定。它产生的地块很漂亮-当然是“出版质量”。由于文档丰富,在线示例代码众多,因此易于学习和使用,而且我认为将gnuplot代码转换为它不会有很多麻烦。毕竟,科学家正在使用matplotlib绘制数据并准备报告-因此它包含了一个人需要的一切。

matplotlib的显着优势之一是您可以将其与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年代输出(拼写为gnuplot而不是GPUplot)。如果使用某些自定义样式(只需定义一次),最终将获得漂亮的绘图。只需查看其他人如何一直在使用这个令人赞叹的软件(参考资料)。
Atcold

8

我玩过两者,并且在Python集成,选项和图形/图形的质量方面,我更喜欢Matplotlib。


6

关于性能并绘制大量点:我比较了这个散点图,该散点图从文本文件中加载了500.000点,并使用gnuplot *和matplotlib保存到png。

500.000 points scatterplot
gnuplot:      5.171 s
matplotlib: 230.693 s

我只运行了一次,结果却不尽相同,但我认为这个主意很明确:gnuplot以性能取胜。

*我直接使用了gnuplot,因为gnuplotpy演示对我来说不是开箱即用的。Matplotlib赢得了Python集成。


4

Gnuplot可以做什么Gnuplot-Py也可以做到。因为Gnuplot可以由pipe(pgnuplot)驱动。Gnuplot-Py只是它的一薄层。因此,您无需为此担心。

为什么我更喜欢gnuplot可能是许多输出格式(PDF,PS和LaTex),这在论文中非常有用,并且默认输出看起来更科学:)


3

的一些专业人士gnuplot(使用多年后,我仍然不喜欢matlibplot):

  • 只需简单地绘制函数sin(x)(无需定义数组和考虑范围)
  • 直接打印文件(无需导入数组)
  • 绘制管道数据(即时执行shell命令"<echo 1 2 3"
  • 复制到剪贴板按钮
  • 更快的绘图
  • 更快的编码

gplot.py是python和jupyter的另一个包装gnuplot包装器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.