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
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:
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
g = Gnuplot.Gnuplot()
g("set terminal png size 640,480")
plt.clf()
for idx, val in enumerate(numberOfPoints):
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()
x = np.random.randint(sys.maxint, size=val)
y = np.random.randint(sys.maxint, size=val)
gdata = zip(x,y)
start = timer()
mPlotAndSave(x, y)
end = timer()
matplotlibTime.append(end - start)
start = timer()
gPlotAndSave(gdata, g)
end = timer()
gnuplotTime.append(end - start)
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()