2016-05-08 34 views
1

Ich habe den folgenden Code:Hinzufügen von Linien Schnittpunkte in Matplotlib beschreiben

plt.figure(figsize=(12,8)) 

plt.plot(range(0, 60), cum_var,'g--', label='explained ratio') 
plt.plot(range(0, 60), 1 - cum_var, 'r--', label='error ratio') 

thre_95 = 0.95 * np.ones(60) 
thre_99 = 0.99 * np.ones(60) 
plt.plot(range(0, 60), thre_95, 'k_', label='0.95 threshold') 
plt.plot(range(0, 60), thre_99, 'k_', label='0.99 threshold') 

idx = np.argwhere(np.isclose(thre_95, cum_var, atol=0.001)).reshape(-1) 
idx[0] += 1 
plt.plot(idx, thre_95[idx], 'ro') 

idx = np.argwhere(np.isclose(thre_99, cum_var, atol=0.0005)).reshape(-1) 
idx[0] += 1 
plt.plot(idx, thre_99[idx], 'ro') 

plt.legend(loc='center right') 
plt.xlabel('Reduced Dimensionality') 
plt.ylabel('Variance Ratio') 
plt.title('Explained Ratio Curve') 
plt.axis([0, 60, 0, 1]) 
plt.grid(True) 
plt.show() 

die folgende Grafik Plots:

enter image description here

Jetzt muss ich x Zeile und y Zeile hinzufügen aus der Schnittpunkt nach unten zu den Achsen, um deutlich zu zeigen, was die Schnittpunkte sind. Wie kann ich es tun?

Edit: Ich habe die Antwort und schaffte es, die Linien zu zeichnen, jetzt ist meine Frage, wie man den x-Wert der hinzugefügten Linie auf der Achse erscheinen lassen?

Ein weiterer edit: Answer for edit question

Antwort

0

Gut gefunden, müssen Sie den Speicherort, an dem Ihre beiden Funktionen (y_1 = cum_var und y_2 = 1 - cum_var) Kreuz finden. Weil einer von ihnen eins minus dem anderen ist, wissen wir, dass ihr Wert 0.5 ist, wenn sie sich kreuzen. So können wir etwas tun, wie,

# Find the index at which `cum_var` is nearest to 0.5 
ind_cross = np.argmin(np.fabs(cum_var - 0.5)) 
# Plot vertical line there 
plt.axvline(ind_cross, color='0.5', ls=':') 

Wenn Sie nur die Linie wollen gehen, wo sie sich kreuzen, können Sie tun,

plt.axvline(ind_cross, ymin=0, ymax=0.5, color='0.5', ls=':') 

Wenn Sie dies genauer machen wollte, dann statt nur zu finden, wo cum_var ist am nächsten-,5, Sie könnten eine Interpolant erstellen und finden genau wo es kreuzt 0,5 (diese heißt ‚root-finding‘), also so etwas wie:

import scipy as sp 
import scipy.interpolate 
import scipy.optimize 

# Create interpolation function from y-vales to x-vales 
interp_func = sp.interpolate.interp1d(cum_var, np.arange(60)) 
# Find the root (so that interp_func(root) = 0.5) 
root = sp.optimize.root(lamda xx: interp_func(xx) - 0.5, 4) 
+0

Danke in der Tat. Das hilft mir. Ich bearbeitet, um etwas mehr Frage hinzuzufügen –

+0

Gefunden die Antwort hier für die zusätzliche Frage http://stackoverflow.com/questions/14716660/adding-extra-axis-ticks-using-matplotlib –

Verwandte Themen