gnuplot vs Matplotlib


84

Tôi đã bắt đầu dự án vẽ đồ thị nhật ký Tomcat bằng cách sử dụng gnuplot-py , liên quan cụ thể đến các yêu cầu cụ thể với cấp phát bộ nhớ và thu thập rác. Trí tuệ tập thể trên gnuplot-py so với Matplotlib để vẽ đồ thị Python là gì. Có thư viện vẽ đồ thị nào tốt hơn mà tôi chưa từng nghe nói đến không?

Những cân nhắc chung của tôi là:

  • Mặc dù gnuplot có lượng lớn tài liệu, nhưng gnuplot-py thì không. Cộng đồng tài liệu cho Matplotlib tốt như thế nào?
  • Có những điều nào mà gnuplot có thể làm được nhưng gnuplot-py thì không?
  • Matplotlib có hỗ trợ Python tốt hơn không?
  • Có những lỗi dừng chương trình lớn trong cả hai? Khó chịu?
  • Hiện tại gnuplot đang vẽ biểu đồ 100.000 điểm, tôi đang có kế hoạch mở rộng quy mô này lên hàng triệu. Tôi có nên mong đợi vấn đề? Matplotlib xử lý điều này tốt như thế nào?
  • Mức độ dễ sử dụng, thời gian quay vòng của gnuplot vs Matplotlib?
  • Việc chuyển mã gnuplot-py hiện có sang Matplotlib sẽ dễ dàng như thế nào?

Bạn sẽ tiếp cận nhiệm vụ này như thế nào?


Một trình bao bọc gnuplot khác là gplot.py cũng hoạt động trong jupyter .
Friedrich

Câu trả lời:


51
  • Bạn có thể tự mình kiểm tra tài liệu của matplotlib . Tôi thấy nó khá toàn diện.
  • Tôi có rất ít kinh nghiệm với gnuplot-py, vì vậy tôi không thể nói liệu nó có thể làm được tất cả những gì gnuplot có thể hay không.
  • Matplotlib được viết và thiết kế đặc biệt cho Python, vì vậy nó rất phù hợp với các thành ngữ Python và những thứ tương tự.
  • Matplotlib là một dự án trưởng thành. NASA sử dụng nó cho một số thứ.
  • Tôi đã vẽ hàng chục triệu điểm trong Matplotlib, và nó trông vẫn đẹp và phản hồi nhanh chóng.
  • Ngoài cách sử dụng Matplotlib theo hướng đối tượng là giao diện pylab, giúp cho việc vẽ biểu đồ dễ dàng như trong MATLAB - nghĩa là rất dễ dàng.
  • Đối với việc chuyển từ gnuplot-py sang matplotlib, tôi không biết.

3
Điểm cộng duy nhất mà tôi có thể nói đối với gnuplot là matplotlib không có khả năng vẽ sơ đồ 3D. Bên cạnh đó, tôi đã sử dụng cả một matplotlib thích hơn cho đến nay.
Physicsmichael

1
@ vgm64: hiện tại SVN đã có thêm 3d trở lại. Tôi chưa tự kiểm tra cái nào nên không thể nói nó đẹp như thế nào. để vẽ đồ thị 3d, tôi sử dụng mayavi2: code.enthought.com/projects/mayavi .
Autoplectic

10
matplotlib hiện có bộ công cụ 3D
Kit

9
"Matplotlib được viết bằng và thiết kế đặc biệt cho Python" - Tôi không đồng ý. API matplotlib khác xa với 'python điển hình' nên điều đó rất khó. Nếu bất cứ điều gì nó bắt chước ngữ nghĩa của matlab.
Ole

6
Thành kiến. bạn có "rất ít kinh nghiệm với gnuplot-py". Thông tin đưa ra là tất cả về matplotlib. Diễn đạt về matplotlib cũng quá chủ quan.
mực

46

Matplotlib = dễ sử dụng, Gnuplot = (tốt hơn một chút) hiệu suất


Tôi biết bài đăng này đã cũ và đã được trả lời nhưng tôi đã đi ngang qua và muốn đặt hai xu của mình. Đây là kết luận của tôi: nếu bạn có một tập dữ liệu không quá lớn, bạn nên sử dụng Matplotlib. Nó dễ dàng hơn và trông đẹp hơn. Tuy nhiên, nếu bạn thực sự cần hiệu suất, bạn có thể sử dụng Gnuplot. Tôi đã thêm một số mã để kiểm tra nó trên máy của bạn và tự xem liệu nó có tạo ra sự khác biệt thực sự hay không (đây không phải là điểm chuẩn hiệu suất thực nhưng nên đưa ra ý tưởng đầu tiên).

Biểu đồ sau thể hiện thời gian cần thiết (tính bằng giây) để:

  • Vẽ biểu đồ phân tán ngẫu nhiên
  • Lưu biểu đồ vào tệp png

Gnuplot VS Matplotlib

Cấu hình:

  • gnuplot: 5.2.2
  • gnuplot-py: 1,8
  • matplotlib: 2.1.2

Tôi nhớ khoảng cách hiệu suất rộng hơn nhiều khi chạy trên một máy tính cũ hơn với các phiên bản thư viện cũ hơn (chênh lệch ~ 30 giây cho một biểu đồ phân tán lớn).

Hơn nữa, như đã đề cập trong phần bình luận, bạn có thể nhận được chất lượng tương đương của các lô. Nhưng bạn sẽ phải đổ nhiều mồ hôi hơn để làm điều đó với Gnuplot.


Đây là mã để tạo biểu đồ nếu bạn muốn thử trên máy của mình:

# -*- 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
Hơn nữa, tôi muốn nói thêm rằng về chất lượng của cốt truyện, chúng tương đương nhau nếu ai đó không chỉ đi theo phong cách mặc định. Hơn nữa, gnuplot có thể được gọi dễ dàng mà không cần phải chạy Python , vì vậy nó độc lập với ngôn ngữ!
Atcold

23

matplotlibcó tài liệu khá tốt và dường như khá ổn định. Các lô nó tạo ra là đẹp - "chất lượng xuất bản" chắc chắn. Do tài liệu tốt và số lượng mã mẫu có sẵn trực tuyến, rất dễ tìm hiểu và sử dụng và tôi không nghĩ bạn sẽ gặp nhiều khó khăn khi dịchgnuplot mã sang nó. Xét cho cùng, matplotlib đang được các nhà khoa học sử dụng để vẽ dữ liệu và chuẩn bị báo cáo - vì vậy nó bao gồm mọi thứ người ta cần.

Một ưu điểm nổi bật của matplotlib là bạn có thể tích hợp nó với GUI Python ( ít nhất là wxPythonPyQt ) và tạo ứng dụng GUI với các ô đẹp mắt.


16

Sau khi sử dụng GNUplot (với trình bao bọc Python của riêng tôi) trong một thời gian dài (và thực sự không thích đầu ra giống những năm 80), tôi mới bắt đầu xem xét matplotlib. Tôi phải nói rằng tôi rất thích nó, đầu ra trông thực sự đẹp và tài liệu có chất lượng cao và phong phú (mặc dù điều đó cũng áp dụng cho GNUplot). Một điều mà tôi đã dành nhiều thời gian tìm kiếm trong các tài liệu matplotlib là cách ghi vào tệp hình ảnh chứ không phải ra màn hình! May mắn thay, trang này giải thích nó khá tốt: http://www.dalkescientific.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html


10
Tôi phải không đồng ý về đầu ra trông giống những năm 80 của gnuplot (được đánh vần là gnuplot chứ không phải GPUplot ). Nếu bạn sử dụng một số kiểu tùy chỉnh (bạn chỉ phải xác định chúng một lần), bạn sẽ có một cốt truyện đẹp. Chỉ cần kiểm tra xem những người khác đã sử dụng phần mềm tuyệt vời này như thế nào ( tham khảo ).
Atcold

8

Tôi đã chơi với cả hai và tôi thích Matplotlib tốt hơn nhiều về tích hợp Python, các tùy chọn và chất lượng của đồ thị / lô.


6

Về hiệu suất và vẽ một số điểm lớn: Tôi đã so sánh điều này với một biểu đồ phân tán 500.000 điểm được tải từ tệp văn bản và được lưu vào png, sử dụng gnuplot * và matplotlib.

500.000 points scatterplot
gnuplot:      5.171 s
matplotlib: 230.693 s

Tôi chỉ chạy nó một lần và kết quả trông không giống nhau, nhưng tôi nghĩ ý tưởng rất rõ ràng: gnuplot thắng về hiệu suất.

* Tôi đã sử dụng trực tiếp gnuplot vì bản demo gnuplotpy không hoạt động phù hợp với tôi. Matplotlib thắng khi tích hợp Python.


4

Gnuplot có thể làm gì Gnuplot-Py cũng có thể làm được. Vì Gnuplot có thể được điều khiển bằng đường ống (pgnuplot). Gnuplot-Py chỉ là một lớp mỏng cho nó. Vì vậy, bạn không cần phải lo lắng về nó.

Tại sao tôi thích gnuplot có thể là nhiều định dạng đầu ra (PDF, PS và LaTex), rất hữu ích trong giấy tờ và đầu ra mặc định trông theo phong cách khoa học hơn :)


3

Một số chuyên gia của gnuplot(tôi vẫn không thích matlibplot sau nhiều năm sử dụng):

  • chức năng âm mưu đơn giản với sin(x)(không cần xác định mảng và suy nghĩ về phạm vi)
  • các tệp âm mưu trực tiếp (không cần nhập vào một mảng)
  • âm mưu-dữ liệu đường ống (thực hiện các lệnh shell một cách nhanh chóng "<echo 1 2 3")
  • nút sao chép vào khay nhớ tạm
  • âm mưu nhanh hơn
  • mã hóa nhanh hơn

gplot.py là một trình bao bọc khác của trình bao bọc gnuplot cho python và jupyter.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.