gnuplot与Matplotlib

93

我已经开始了一个项目,使用Tomcat日志和gnuplot-py绘制图表,特别是将特定请求与内存分配和垃圾回收相关联。在Python绘图方面,gnuplot-py与Matplotlib相比,有什么共识?还有没有更好的绘图库我没听说过的?

我的一般考虑因素是:

  • 虽然gnuplot有大量的文档,但gnuplot-py没有。Matplotlib的文档社区有多好?
  • gnuplot能做到的事情,gnuplot-py不能吗?
  • Matplotlib是否具有更好的Python支持?
  • 它们中是否存在重大的问题或烦恼?
  • 目前,gnuplot正在绘制数十万个点,我计划将其扩展到数百万个。我应该期望出现问题吗?Matplotlib处理这方面的问题如何?
  • 使用便捷性,gnuplot与Matplotlib的周转时间如何?
  • 将现有的gnuplot-py代码移植到Matplotlib有多容易?

您会如何处理此任务?


另一个gnuplot的封装是gplot.py,它也可以在jupyter中使用。 - Friedrich -- Слава Україні
8个回答

54
  • 你可以自己查阅 matplotlib 文档 。 我发现它非常全面。
  • 我对 gnuplot-py 的经验很少,因此无法确定它是否具有 gnuplot 的全部功能。
  • Matplotlib 是使用 Python 编写并专门设计的,因此与 Python 语言习惯非常契合。
  • Matplotlib 是一个成熟的项目。 NASA 在某些项目中使用它。
  • 我已经在 Matplotlib 中绘制了数千万个数据点,图表依然美观且响应迅速。
  • 除了使用 Matplotlib 面向对象的方式外,还有 pylab 接口,使得绘图就像在 MATLAB 中一样容易 - 非常简单。
  • 至于从 gnuplot-py 到 matplotlib 的移植,我不知道。

3
我可以说的唯一好处是gnuplot具有3D绘图功能,而matplotlib没有。除此之外,我已经使用过两者并且更喜欢使用matplotlib。 - physicsmichael
1
@vgm64:当前的SVN已经重新添加了3D功能。我自己还没有测试过,所以无法说它有多好。对于3D绘图,我使用mayavi2:http://code.enthought.com/projects/mayavi/。 - Autoplectic
10
Matplotlib现在拥有一个3D工具包。 (Matplotlib now has a 3D toolkit.) - Kit
11
“Matplotlib是用Python编写的并专门为Python设计的” - 我不同意。Matplotlib API与“典型的Python”相距甚远,这让人感到痛苦。如果说有什么相似之处,那就是它模仿了Matlab语法。 - Ole
7
有偏见。你对 gnuplot-py 的经验非常少。提供的信息都是关于 matplotlib 的。对于 matplotlib 的表述也太主观了。 - squid

50

Matplotlib = 使用简便,Gnuplot = (稍微更好的)性能


我知道这篇帖子已经老旧并且有答案了,但我路过这里,想要分享我的看法。这是我的结论:如果你的数据集不算太大,你应该使用Matplotlib。它更容易使用,看起来更好看。然而,如果你真的需要性能,可以使用Gnuplot。我添加了一些代码,可以在你的机器上测试一下,看看是否会有真正的差别(这不是真正的性能基准测试,但应该可以给出一个初步想法)。

以下图表表示所需的时间(以秒为单位):

  • 绘制随机散点图
  • 将图保存到png文件中

Gnuplot VS Matplotlib

配置:

  • gnuplot: 5.2.2
  • gnuplot-py: 1.8
  • matplotlib: 2.1.2

我记得在旧电脑和旧版本的库上运行时,性能差距要大得多(对于大型散点图相差约30秒)。

此外,如评论中所述,你可以获得与Gnuplot相当的绘图质量。但你需要付出更多的努力来使用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()

9
此外,我想补充一点,在情节质量方面,如果有人不仅仅使用默认样式,它们在质量上是相等的*。此外,gnuplot可以轻松调用,无需运行Python*,因此它是语言无关的! - Atcold

26
matplotlib拥有相当好的文档,并且似乎非常稳定。它生成的图形非常漂亮,绝对符合 "出版品质"。由于有良好的文档和在线可用的大量示例代码,因此很容易学习和使用,我认为您不会在将gnuplot代码转换到它时遇到太多麻烦。毕竟,matplotlib被科学家用于绘制数据和准备报告-因此它包含了所有所需的功能。

matplotlib的显著优点之一是您可以将其与Python GUI(至少有wxPythonPyQt)集成,并创建带有漂亮图形的GUI应用程序。


18

在使用GNUplot(与我自己的Python包装器一起)很长时间后(并且真的不喜欢80年代的外观),我刚开始看matplotlib。我必须说我非常喜欢它,输出看起来非常好,文档质量也很高且内容广泛(尽管GNUplot也是如此)。在matplotlib文档中我花了很长时间寻找的一个东西是如何将图形写入图像文件而不是屏幕!幸运的是,这个页面解释得很清楚:http://www.dalkescientific.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html


12
我对 gnuplot 的 80 年代外观并不同意(它的拼写是 gnuplot 而不是 GPUplot)。如果你使用一些自定义样式(只需要定义一次),你最终将获得漂亮的图表。只需查看其他人如何使用这个惊人的软件即可(参考链接)。 - Atcold

10

关于性能和绘制大量数据点:我使用gnuplot *和matplotlib比较了500,000个数据点的散点图,这些数据点从文本文件中加载并保存为png。

500.000 points scatterplot
gnuplot:      5.171 s
matplotlib: 230.693 s

我只运行了一次,结果看起来不完全相同,但是我认为思路很清晰:gnuplot在性能方面胜出。

*我直接使用了gnuplot,因为gnuplotpy演示对我来说无法直接使用。Matplotlib在Python集成方面胜出。


8

我已经使用过这两个工具,就Python集成、选项和图形/图表质量而言,我更喜欢Matplotlib。


5

gnuplot的几个优点(我多年使用matlibplot仍然不喜欢它的原因):

  • 只需使用 sin(x) 就可以简单地绘制函数(无需定义数组和考虑范围)
  • 直接绘制文件(无需导入到数组中)
  • 绘制管道数据(在执行shell命令时即可实现"<echo 1 2 3"
  • 复制到剪贴板按钮
  • 绘图更快
  • 编码速度更快
  • 易于记住关键字

gplot.py是Python和Jupyter的另一个gnuplot包装器。


虽然我使用GUI创建Python程序,但我没有使用过matplotlib,因此无法进行比较。相反,我使用gnuplot脚本的“库”,即通过Python程序执行的文本文件来绘制数据。我不确定是否可以在matplotlib中使用类似的模板,或者每次对绘图布局进行小改动时,是否需要重新编译程序并要求所有用户更新Python程序,而不仅仅是更新一个小的文本文件。也许您可以对此发表评论? - theozh
@theozh:这与主题不相关,但我猜你在寻找 load 的类似物,Python 有模块的 reload 和字符串片段的 eval。记住,从 Python 调用 gnuplot 脚本类似于动态导入。 - Friedrich -- Слава Україні

5

Gnuplot能做的事情,Gnuplot-Py也能做到。因为Gnuplot可以通过管道(pgnuplot)来驱动。而Gnuplot-Py只是它的一个薄层。所以你不需要担心这个问题。

为什么我更喜欢Gnuplot呢?可能是因为它支持多种输出格式(PDF,PS和LaTex),这在论文中非常有用,并且默认输出看起来更加科学风格:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接