माटप्लोटलिब = उपयोग में आसानी, Gnuplot = (थोड़ा बेहतर) प्रदर्शन
मुझे पता है कि यह पोस्ट पुरानी है और इसका उत्तर दिया गया है लेकिन मैं इससे गुजर रहा था और अपने दो सेंट लगाना चाहता था। यहाँ मेरा निष्कर्ष है: यदि आपके पास एक बड़ा डेटा सेट नहीं है, तो आपको Matplotlib का उपयोग करना चाहिए। यह आसान है और बेहतर दिखता है। हालाँकि, यदि आपको वास्तव में प्रदर्शन की आवश्यकता है , तो आप Gnuplot का उपयोग कर सकते हैं। मैंने आपकी मशीन पर इसका परीक्षण करने के लिए कुछ कोड जोड़ा है और अगर यह एक वास्तविक अंतर है (यह एक वास्तविक प्रदर्शन बेंचमार्क नहीं है, लेकिन पहले विचार देना चाहिए)।
निम्नलिखित ग्राफ आवश्यक समय (सेकंड में) का प्रतिनिधित्व करता है:
- एक यादृच्छिक तितर बितर ग्राफ प्लॉट करें
- ग्राफ़ को png फ़ाइल में सहेजें
विन्यास:
- gnuplot: 5.2.2
- gnuplot-py: 1.8
- matplotlib: 2.1.2
मुझे याद है कि लाइब्रेरी के पुराने संस्करणों के साथ पुराने कंप्यूटर पर चलने पर प्रदर्शन का अंतर बहुत व्यापक होता है (एक बड़े स्कैटर प्लॉट के लिए ~ 30 सेकंड का अंतर)।
इसके अलावा, जैसा कि टिप्पणियों में बताया गया है, आप भूखंडों के बराबर गुणवत्ता प्राप्त कर सकते हैं। लेकिन आपको इसे Gnuplot के साथ करने के लिए अधिक पसीना डालना होगा।
यदि आप इसे अपने मशीन पर आज़माना चाहते हैं तो ग्राफ बनाने के लिए कोड यहाँ है :
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()