代码之家  ›  专栏  ›  技术社区  ›  Ethan Heilman

gnuplot与Matplotlib

  •  75
  • Ethan Heilman  · 技术社区  · 17 年前

    Tomcat gnuplot-py ,特别是将特定请求与内存分配和垃圾回收相关联。问题是什么 关于gnuplot py vs的集体智慧 Matplotlib

    我的一般考虑是:

    • 虽然gnuplot有大量文档,但gnuplotpy没有。Matplotlib的文档社区有多好?
    • Matplotlib是否有更好的Python支持?
    • 这两个地方都有阻止虫子的大型表演吗?烦恼?
    • 目前gnuplot正在绘制100000个点,我计划将其扩展到数百万个。我应该期待问题吗?Matplotlib处理这个问题的能力如何?
    • 将现有的gnuplot py代码移植到Matplotlib有多容易?

    你将如何完成这项任务?

    7 回复  |  直到 15 年前
        1
  •  54
  •   Cimbali    9 年前
    • 你可以查一下 matplotlib's documentation 你自己我觉得它相当全面。
    • Matplotlib是用Python编写的,专门为Python设计的,因此它非常适合Python习语等。
    • Matplotlib是一个成熟的项目。NASA用它来做一些事情。
    • 我已经在Matplotlib中绘制了数千万个点,它看起来仍然很漂亮,响应速度也很快。
    • 除了使用Matplotlib的面向对象方法之外,还有pylab接口,它使绘图与在MATLAB中一样简单——也就是说,非常简单。
        2
  •  48
  •   7hibault    8 年前

    Matplotlib=易用性,Gnuplot=(稍好)性能


    真正地 需要性能,可以使用Gnuplot。我添加了一些代码,在您的机器上进行测试,看看它是否真的有什么不同(这不是一个真正的性能基准测试,但应该给出第一个想法)。

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

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

    Gnuplot VS Matplotlib

    配置:

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

    此外,正如评论中提到的,您可以获得同等质量的绘图。但要使用Gnuplot实现这一点,您必须付出更多的努力。


    Here's the code to generate the graph 如果您想在您的机器上试用:

    # -*- 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()
    
        3
  •  24
  •   Eli Bendersky    17 年前

    matplotlib 有相当好的文档,并且看起来相当稳定。它所制作的情节是美丽的——“出版质量”是肯定的。由于良好的文档和大量在线可用的示例代码,它很容易学习和使用,而且我认为您在翻译方面不会有太多困难 gnuplot 密码。毕竟,matplotlib被科学家用来绘制数据和准备报告——所以它包含了人们所需要的一切。

    wxPython PyQt ,至少)并创建具有良好绘图的GUI应用程序。

        5
  •  8
  •   Corey Goldberg    17 年前

    这两个我都玩过,我更喜欢Matplotlib的Python集成、选项和图形/绘图的质量。

        6
  •  8
  •   Mark    11 年前

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

    500.000 points scatterplot
    gnuplot:      5.171 s
    matplotlib: 230.693 s
    

    我只运行了一次,结果看起来并不完全相同,但我认为想法很清楚:gnuplot在性能上获胜。

    *我直接使用gnuplot,因为gnuplotpy演示对我来说不是现成的。Matplotlib在Python集成中获胜。

        7
  •  4
  •   joseph.smeng    13 年前

    Gnuplot能做的事Gnuplot Py也能做。因为Gnuplot可以由管道驱动(pgnuplot)。

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

        8
  •  4
  •   Friedrich -- Слава Україні    5 年前

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

    • 作用 简单地 sin(x) (无需定义数组和考虑范围)
    • 情节 文件夹 直接(无需导入数组)
    • 绘制管道数据(动态执行shell命令 "<echo 1 2 3" )
    • 快速绘图
    • 更快的编码
    • 关键词更容易记忆

    gplot.py