2017-05-24 15 views
0

Ich muss Tausende von Streudiagrammen erzeugen und speichern, die im Wesentlichen die gleichen sind, außer dass sich nur die Variable "y" ändert. Was ist der schnellste Weg, dies zu tun?Der effizienteste Weg, um viele Figuren mit Matplotlib zu erzeugen

Ich dachte über die Abbildung und Achsen Instanz erstellen und dann einfach zwischen den Parzellen wie folgt gelöscht werden:

import matplotlib.pyplot as plt 
import numpy as np 

data = np.random.random((100, 1000)) 
x = list(range(100)) 

fig = plt.figure() 
ax = fig.add_subplot(111) 

for i in range(data.shape[1]): 
    ax.scatter(x, data[:,i]) 
    fig.savefig("%d.png" % i, dpi=100) 
    ax.cla() 

Diese immer noch eine anständige Menge an Zeit in Anspruch nimmt, so ist ein besserer/schnellerer Weg, dies zu tun? Jedes Bild in diesem Beispiel ist ungefähr 15kb, also gehe ich davon aus, dass das Schreiben auf die Festplatte die Geschwindigkeit nicht zu sehr einschränkt.

Antwort

3

Eine Option besteht darin, mehrere Prozesse zu verwenden.

import matplotlib.pyplot as plt 
import numpy as np 
import multiprocessing 

data = np.random.random((100, 1000)) 
x = list(range(100)) 

fig = plt.figure() 
ax = fig.add_subplot(111) 

def save_plot(i): 
    ax.scatter(x, data[:,i]) 
    fig.savefig("%d.png" % i, dpi=100) 
    ax.cla() 

p = multiprocessing.Pool(4) 
p.map(save_plot, range(data.shape[1])) 
+0

finden ich diese Option mögen, aber hatte gehofft, für etwas ähnliches auf die unten Antwort. Dies könnte jedoch mit diesem Ansatz kombiniert werden – pbreach

2

Versuchen Sie, Ihre Figuren ohne GUI zu erstellen. Das finde ich viel schneller beim Erstellen und Speichern vieler Figuren.

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas 
from matplotlib.figure import Figure 
import matplotlib.pyplot as plt 
fig = plt.Figure() 
ax = fig.add_subplot(111) 
ax.plot(range(5)) 
canvas = FigureCanvas(fig) 
canvas.print_figure('sample.png') 

ähnlich Etwas kann bei http://www.dalkescientific.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html

+0

Dieser Ansatz wäre perfekt. Ich muss es testen – pbreach

Verwandte Themen