2016-05-12 24 views
0

Ich habe 58 Dateien, die ich plotten muss. Einige von ihnen sind leer (nicht wichtig, ich habe sie bereits mit der if-Bedingung übersprungen). Ich muss die Daten in den Dateien mit einer Loglog-Skala mit Fehlerbalken plotten. Und ich möchte die Plots am Ende speichern. Ich benutze Python, Spyder. Ich habe den folgenden Code geschrieben:Python: Plotten Fehlerbalken in einem Loglog-Maßstab, in einer Schleife und dann das Bild speichern

route='/......./' 
L=np.arange (1,59, 1) 
for i in range (L.shape[0]): 
    I=L[i] 
    name_sq= 'Spectra_without_quiescent_'+('{}'.format(I))+'.dat' 
    Q=np.loadtxt(route+name_sq) 
    if (len(Q) != 0): 
     x=Q[:,1] 
     y=Q[:,2] 
     z=Q[:,3] 
     fig=plt.errorbar(x,y,yerr=z, fmt = 'b') 
     fig.set_yscale('log') 
     fig.set_xscale('log') 
     xlabel='Frequency' 
     ylabel='Flux' 
     title='Spectrum_'+('{}'.format(I))+'.dat' 
     name='Spectrum_without_quiescent_'+('{}'.format(I))+'.pdf' 
     fig.savefig(route+name, fig) 

jedoch, wenn ich es laufen, bekomme ich folgende Fehlermeldung:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 540, in runfile 
    execfile(filename, namespace) 
    File "/media/chidiac/My Passport/DOCUMENTS/My_Publications/2-3C273_radio_spectra/Maximum_flux_code.py", line 49, in <module> 
    fig.set_yscale('log') 
AttributeError: 'ErrorbarContainer' object has no attribute 'set_yscale' 

Ich bin noch ein Anfänger in Python, und ich kann den Fehler nicht finden oder wie man es repariert. Jede Hilfe wird sehr geschätzt.

Antwort

0

Ein Freund von mir hat mir geholfen, mit diesem Thema und wenn jemand interessiert ist, hier ist die Lösung:

route='/....../' 
L=np.arange (1,59, 1) 
print L 
for i in range (L.shape[0]): 
    I=L[i] 
    name_sq= 'Spectra_without_quiescent_'+('{}'.format(I))+'.dat' 
    Q=np.loadtxt(route+name_sq) 
    if (len(Q) != 0): 
     x=np.log(Q[:,1]) 
     y=np.log(Q[:,2]) 
     z=np.log(Q[:,3]) 
     fig, ax = plt.subplots(facecolor='w', edgecolor='k') 
    plt.errorbar(x,y,yerr=z, fmt = 'b') 
    plt.ylabel('Flux', size='x-large') 
    plt.xlabel('Frequency', size='x-large') 
    title='Spectrum_'+('{}'.format(I))+'.dat' 
    name='Spectrum_without_quiescent_'+('{}'.format(I))+'.pdf' 
    pylab.savefig(route+name) 

Der erste Trick war, um zuerst den Log-Wert der Daten zu erhalten und sie dann grafisch darzustellen. Da mir kein Befehl bekannt ist, mit dem ich die Fehlerbalken in einer Protokollskala darstellen kann, halte ich dies für die beste Lösung. Der zweite Trick bestand darin, Subplots zu verwenden. Ansonsten habe ich die 58 Kurven in einem Plot, 58 mal.

Ich hoffe, diese Lösung ist hilfreich.

0

Dieser Beitrag kann ein bisschen alt sein, aber ich hatte das gleiche Problem und vielleicht wird dies anderen in der Zukunft helfen.

Ihre ursprüngliche Lösung war eigentlich fast korrekt. set_yscale ist jedoch eine Methode der Achsen, nicht die Abbildung. So kann Ihr Code in der if-Anweisung sollte wie folgt aussehen:

import matplotlib.pyplot as plt 

# other stuff you did .. 

x=Q[:,1] 
y=Q[:,2] 
z=Q[:,3] 
fig = plt.figure() 
ax = plt.axes() 
ax.set_xscale("log") 
ax.set_yscale("log") 
ax.errorbar(x,y,yerr=z, fmt = 'b') 
ax.set_xlabel("Frequency") 
ax.set_ylabel("Flux") 
ax.set_title("Spectrum_{}.dat".format(I)) 
name="Spectrum_without_quiescent_{}.pdf".format(I) 
plt.savefig(route+name) 

Wo ich auch Ihre Nutzung der Funktion format eingestellt.

Beachten Sie, dass Ihre zweite Lösung nicht immer ordnungsgemäß funktioniert. Wenn Sie sehr kleine Werte und kleine Fehlerbalken haben, wird der Logarithmus dieser kleinen Werte groß (zB log (10^(- 6)) = -6, da der Logarithmus zur Basis 10 verwendet wird) und Sie werden große Fehlerbalken haben Der tatsächliche Fehler ist klein.

Lange Geschichte kurz: Verwenden Sie ax.set_*scale. Es ist sicher.