سؤال

لقد بدأت في الرسوم البيانية للمشروع هر سجلات باستخدام gnuplot-py., ، على وجه التحديد ترتبط طلبات معينة مع تخصيص الذاكرة ومجموعة القمامة. ما هي الحكمة الجماعية على gnuplot-py vs matplotlib. ل python الرسوم البيانية. هل هناك أفضل مكتبات رسوم الرسوم البيانية التي لم أسمع بها؟

اعتباراتي العامة هي:

  • في حين أن GNUPLOT لديه كميات كبيرة من الوثائق، إلا أن Gnuplot-Py لا. كيف جيدة هو مجتمع الوثائق ل matplotlib؟
  • هل هناك أشياء يمكن أن تفعلها gnuplot، ولكن لا يستطيع gnuplot-py؟
  • هل matplotlib لديه دعم أفضل لبثون؟
  • هل هناك عرض كبير إيقاف الأخطاء في أي؟ المضايقات؟
  • حاليا Gnuplot هو رسوم 100000 من النقاط، وأخطط لتوسيع نطاق هذا الأمر إلى الملايين. يجب أن أتوقع المشاكل؟ كيف جيدا matplotlib التعامل مع هذا؟
  • سهولة الاستخدام، وقت التحول ل gnuplot vs matplotlib؟
  • ما مدى سهولة تشغيل رمز GNUPLOT-PY الحالي إلى Matplotlib؟

كيف تقترب من هذه المهمة؟

هل كانت مفيدة؟

المحلول

  • يمكنك التحقق وثائق matplotlib نفسك. أجد أنه شامل تماما.
  • لدي خبرة قليلة للغاية مع GnuPlot-Py، لذلك لا أستطيع أن أقول ما إذا كان يمكن أن تفعل كل ما يمكن
  • Matplotlib مكتوب في وتصميم خصيصا لبيتثون، لذلك يناسب تماما مع التعابير بيثون ومثل هذا.
  • matplotlib هو مشروع ناضج. تستخدم ناسا لبعض الأشياء.
  • لقد رسمت عشرات الملايين من النقاط في Matplotlib، وما زالت تبدو جميلة وردت بسرعة.
  • بعد الطريقة الموجهة للكائنات لاستخدام Matplotlib هي واجهة Pylab، مما يجعل التخطيط لسهولة ما هو في Matlab - وهذا سهل للغاية.
  • أما بالنسبة للتنقل من Gnuplot-Py إلى Matplotlib، ليس لدي أي فكرة.

نصائح أخرى

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

matplotlib لديه وثائق جيدة جدا، ويبدو أنها مستقرة تماما. المؤامرات التي تنتجها جميلة - "جودة النشر" بالتأكيد. نظرا للوثائق الجيدة ومقدار التعليمات البرمجية المتوفرة عبر الإنترنت، من السهل التعلم والاستخدام، ولا أعتقد أن لديك الكثير من المتاعب ترجمة gnuplot رمز لذلك. بعد كل شيء، يتم استخدام Matplotlib من قبل العلماء لرسم البيانات وإعداد التقارير - لذلك يتضمن كل ما يحتاجه كل شيء.

ميزة واحدة ملحوظة من matplotlib هي أنه يمكنك دمجه مع بايثون غياني (Wxpython. و pyqt., ، على الأقل) وإنشاء تطبيق واجهة المستخدم الرسومية مع مؤامرات لطيفة.

بعد استخدام Gnuplot (مع غلاف بيثون الخاص بي) لفترة طويلة (ولا تروق حقا إخراج 80s المظهر)، بدأت في إلقاء نظرة على matplotlib. يجب أن أقول أنني أحب ذلك كثيرا، يبدو الإخراج لطيفا حقا والمستندات عالية الجودة واسعة النطاق (على الرغم من أن هذا يذهب أيضا إلى gnuplot). الشيء الوحيد الذي قضيته في الأعمار البحث في مستندات matplotlib هو كيفية الكتابة إلى ملف صورة بدلا من الشاشة! لحسن الحظ توضح هذه الصفحة أنه جيد جدا: http://www.dalkescientic.com/writings/Diary/archive/2005/04/23/MATPLOTLIB_WITHOUT_GUI.HTML.

لقد لعبت مع كل من، وأنا أحب matplotlib أفضل بكثير من حيث تكامل بيثون والخيارات وجودة الرسوم البيانية / المؤامرات.

ما يمكن أن يفعله gnuplot هل يمكن أن يفعله gnuplot-py أيضا. لأن gnuplot يمكن أن يكون مدفوعا بواسطة الأنابيب (pgnuplot). Gnuplot-Py هو مجرد طبقة رقيقة لذلك. لذلك لا تقلق بشأن ذلك.

لماذا أفضل gnuplot ربما يكون العديد من تنسيق الإخراج (PDF، PS و Latex)، وهو مفيد للغاية في الأوراق، والمخرجات الافتراضية تبدو أكثر علمية :)

حول الأداء والتخطيط لعدد كبير من النقاط: قارن ذلك من أجل ScatterPlot من 500.000 نقطة تحميل من ملف نصي وحفظه على PNG، باستخدام Gnuplot * و Matplotlib.

500.000 points scatterplot
gnuplot:      5.171 s
matplotlib: 230.693 s

لقد ركضت مرة واحدة فقط والنتائج لا تبدو متطابقة، لكنني أعتقد أن الفكرة واضحة: فاز gnuplot في الأداء.

* لقد استخدمت gnuplot مباشرة لأن تجريبي GNUPLOTPY لا يعمل خارج الصندوق بالنسبة لي. Matplotlib يفوز في تكامل بيثون.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top