2012-10-24 15 views
14

Ich erstelle ein paar pdf-Plots mit Matplotlib, die aus 400 Unterplots besteht. Jeder hat nur 5 Datenpunkte. Es dauert 420 s auf einem guten Computer, um 5 pdf-Bild zu speichern. Gibt es eine Möglichkeit, den Code zu optimieren, oder ist es nur normal für Matplotlib?Matplotlib sehr langsam. Es ist normal?

Teil des Codes für das Plotten:

plot_cnt = 1 
for k in np.arange(K_min, K_max + 1): 
    for l in np.arange(L_min, L_max + 1): 
     ax = plt.subplot(grid[0], grid[1], plot_cnt) 
     plot_cnt += 1 
     plt.setp(ax, 'frame_on', False) 
     ax.set_ylim([-0.1, 1.1]) 
     ax.set_xlabel('K={},L={}'.format(k, l), size=3) 
     ax.set_xlim([-0.1, 4.1]) 
     ax.set_xticks([]) 
     ax.set_yticks([]) 
     ax.grid('off') 
     ax.plot(np.arange(5), (data['S1']['Azimuth'][:, k - 1, l + offset_l] + \ 
       data['S1']['Delta Speed'][:, k - 1, l + offset_l] + \ 
       data['S1']['Speed'][:, k - 1, l + offset_l])/3, 
       'r-o', ms=1, mew=0, mfc='r') 
     ax.plot(np.arange(5), data['S2'][case][:, k - 1, l + offset_l], 
       'b-o', ms=1, mew=0, mfc='b') 
plt.savefig(os.path.join(os.getcwd(), 'plot-average.pdf')) 
plt.clf() 
print 'Final plot created.' 

Schluss Bild: enter image description here

+3

400 Subplots scheint viel für mich. Selbst wenn Sie nicht viele Daten haben, kann matplotlib nicht optimiert werden, um diese Art von Gittern anzuzeigen. – Simon

+1

@Simon, ist es möglich, mit einem großen Subplot zu plotten? Dann sollte jede fünf verbunden sein. Irgendeine Idee? – rowman

+0

Ich habe nicht die richtige Umgebung, um die Tests durchzuführen, aber es gibt ein paar Dinge, die Sie tun können. Der erste Schritt besteht darin, den Profiler auf Ihrem Code auszuführen (siehe [hier] (http://stackoverflow.com/questions/582336/how-can-you-profile-a-python-script) für weitere Informationen). Mit dieser können Sie feststellen, wo die Zeit verbracht wird. Die zwei Dinge, die Sie versuchen könnten, ist, eine Ressource zu finden, die bei jedem Schritt freigegeben wird, oder die Plots in mehreren Prozessen mit [Multiprocessing] zu erstellen (http://docs.python.org/library/multiprocessing.html). Wenn ich die Zeit finde, werde ich das versuchen, aber in diesem Stadium kann ich nichts garantieren – Simon

Antwort

20

Gebäude aus von dem, was gesagt @rowman, können Sie dies in einem Achsen alles tun (wie Sie alle Zecken deaktivieren etc). Etwas wie:

K_max = 20 
K_min = 0 
L_max = 20 
L_min = 0 
ax = plt.subplot(111) 
x_offset = 7 # tune these 
y_offset = 7 # tune these 
plt.setp(ax, 'frame_on', False) 
ax.set_ylim([0, (K_max-K_min +1)*y_offset ]) 
ax.set_xlim([0, (L_max - L_min+1)*x_offset]) 
ax.set_xticks([]) 
ax.set_yticks([]) 
ax.grid('off') 



for k in np.arange(K_min, K_max + 1): 
    for l in np.arange(L_min, L_max + 1): 
     ax.plot(np.arange(5) + l*x_offset, 5+rand(5) + k*y_offset, 
       'r-o', ms=1, mew=0, mfc='r') 
     ax.plot(np.arange(5) + l*x_offset, 3+rand(5) + k*y_offset, 
       'b-o', ms=1, mew=0, mfc='b') 
     ax.annotate('K={},L={}'.format(k, l), (2.5+ (k)*x_offset,l*y_offset), size=3,ha='center') 
plt.savefig(os.path.join(os.getcwd(), 'plot-average.pdf')) 

print 'Final plot created.' 

Läuft in etwa einer Sekunde oder zwei. Ich denke, die ganze Zeit wird damit verbracht, das axes Objekt einzurichten, das intern ziemlich komplex ist. output with fake data

+0

Sehr nett. Kann die Technik, die [hier] (http://www.scipy.org/Cookbook/Matplotlib/Animations) erwähnt wird, gerade aus Unerschrockenheit auch verwendet werden? Verwenden Sie einfach "set_ydata" von line. Sollte jedoch eine Methode zum Kopieren von Ax-Objekten finden. – rowman

+0

@rowman können Sie genauer über welche Methode bei diesem Link? Wenn Sie 400 verschiedene Zahlen machen möchten, wäre 'set_ydata' nützlich, aber ich sehe nicht sofort, dass es in diesem Fall nützlich wäre. – tacaswell

+0

Für GUI-Anwendungen erstelle ich nur eine Zeile und aktualisiere Y nur, um schnell zu sein, anstatt die ganze Figur jedes Mal neu zu zeichnen. In diesem Fall habe ich nur daran gedacht, 400 Figuren zu erstellen, ein Objekt 400 Mal zu kopieren, Y und die Position der Figurenachse zu aktualisieren. Es könnte jedoch die gleiche Zeit dauern. – rowman