2016-08-06 19 views
0

Mit Matplotlib Version 1.5.1 und Python 2.7.11 habe ich festgestellt, dass ich die Grenzen in y manuell angeben muss oder sonst nur den größten y-Wert Punkt geplottet wird. Arrays verhalten sich genauso.Warum wählt Matplotlib den falschen Bereich in y unter Verwendung der Protokollskala?

Wenn ich den ersten Punkt entferne, bekomme ich ein paar mehr Punkte, aber nicht alle.

Ich kann mich nicht daran erinnern, dass ich jemals solche Grenzen manuell festlegen musste - warum hier?

enter image description here

import matplotlib.pyplot as plt 

X = [0.997, 2.643, 0.354, 0.075, 1.0, 0.03, 2.39, 0.364, 0.221, 0.437] 
Y = [15.487507, 2.320735, 0.085742, 0.303032, 1.0, 0.025435, 4.436435, 
    0.025435, 0.000503, 2.320735] 

plt.figure() 

plt.subplot(1,2,1) 
plt.scatter(X, Y) 
plt.xscale('log') 
plt.yscale('log') 


plt.subplot(1,2,2) 
plt.scatter(X, Y) 
plt.xscale('log') 
plt.yscale('log') 
plt.ylim(0.5*min(Y), 2.0*max(Y)) # why is this line necessary? 
plt.title('added plt.ylim()') 

plt.show() 

Antwort

3

Das Problem entsteht, weil man zuerst das Streudiagramm gezeichnet hat und dann die Waage als logarithmisch, die in einem Zoom-in-Effekt zur Folge hat. Dies behebt das Problem:

plt.xscale('log') 
plt.yscale('log') 
plt.scatter(X, Y) 

Dies erzeugt das beabsichtigte Ergebnis. (2. Teilplot in Ihrer Frage.)

+0

OK, das ist eine Lösung, aber ist das so, wie es funktionieren soll? Es betrifft nur die y-Skala, die x-Skala benötigt dies nicht. – uhoh

+0

Ich denke, ich muss es immer in der 'richtigen' Reihenfolge gemacht haben, ohne es zu merken. Vielen Dank! – uhoh

1

Es scheint so, als ob matplotlib die Y-Achsen-Ticks vor der Konvertierung in eine logarithmische Skala erstellt und dann die Ticks nicht basierend auf der Änderung neu erstellt. Die Y-Achse auf Ihrem ersten Teilplot beginnt bei 10e1, nicht bei 10e-3. Ändern Sie also die Skalen, bevor Sie plotten.

plt.xscale('log') 
plt.yscale('log') 
plt.scatter(X, Y) 

Ich denke, wenn Sie die ursprüngliche Skala neben dem Log-Skala plotten, dass Sie die Antwort auf die teilweise Behandlung der Achsen durch matplotlib, um herauszufinden, der Lage sein. In einer logarithmischen Skala gibt es keine wahre 0 - weil log (0) nicht definiert ist. Also muss die Koordinate irgendwo über 0 beginnen, und das verursacht die Probleme. Ihre x-Achse reicht von 0 bis 3, aber y von 0 bis 16. Wenn sie in Protokoll umgewandelt wird, skaliert matplotlib korrekt x-Achse, aber da y einen Faktor von 10 hat, fehlt die Skalierung.

+0

y, aber nicht x? Ich benutze ständig log, manchmal x oder y oder beide Achsen. Ich habe das noch nie zuvor gesehen. – uhoh

+0

hmm ... wie ich in der anderen Antwort gesagt habe, habe ich es vielleicht immer in dieser Reihenfolge gemacht, ohne wirklich zu bemerken, dass es die "richtige" Reihenfolge ist. – uhoh

+1

Siehe Bearbeiten in Antwort für eine plausible Erklärung. – Kartik