2014-01-14 11 views
6

Ich versuche, ein numpy-Array so zu plotten, dass alle Punkte mit dem gleichen y-Achsenwert in einer geraden Linie verbunden werden sollen. Aber einige, wie ich das nicht erreichen kann.Verbinden Sie Punkte mit demselben Wert in Python matplotlib

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

# Declare numpy array with nans 
x=np.array([np.nan,10005,10005,10006,10006,10006,10007,10007,10007, 10008,10007,10008,10008,10008, np.nan,10010,10010,10010, np.nan, np.nan, np.nan, np.nan]) 

# Plot the points 
plt.plot(x, marker="o", linestyle='-') 

# Display the plot in the window 
plt.show() 

Daraus ergibt sich: enter image description here

Aber ich würde die Handlung sein mag:

enter image description here

Auch, wenn es einen Weg gibt einen gewissen Spielraum an der Spitze hinzuzufügen und Unterseite des Diagramms, um die Grenzpunkte deutlich anzuzeigen.

+2

Die naive Lösung wäre, eine Liste von Listen allen gleich y-Wertes zu machen und separat diejenigen, die als Linien zu zeichnen. –

+1

Wenn Sie mehr Kontrolle über die Figur haben möchten, um zum Beispiel den Rand zu kontrollieren, können Sie auch Figuren- und Achsenobjekte erstellen, was es einfacher macht, alle möglichen Dinge für die Figur (und ihre Achsen) einzustellen. Wie fig, axes = pltplots() –

Antwort

4

Schleife über eine eindeutige Liste Ihrer y-Werte (Ich habe die Beschriftung geändert, um die Dinge klarer zu machen). Sie benötigen auch eine Menge von x-Werten, diese sind implizit die gleichen wie Ihre Handlung, aber wir brauchen die Standorte.

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

# Declare numpy array with nans 
y=np.array([np.nan,10005,10005,10006,10006,10006,10007,10007,10007, 10008,10007,10008,10008,10008, np.nan,10010,10010,10010, np.nan, np.nan, np.nan, np.nan]) 
x=np.arange(y.size) 

for yv in np.unique(y): 
    if yv != np.nan: 
     idx = y == yv 
     plt.plot(x[idx],y[idx],marker='o',linestyle='-',color='b') 
plt.margins(.1,.1) 
plt.show() 

Mit plt.margins können Sie sich vom Grundstück etwas Raum geben die Grenze schneidet.

enter image description here

+1

Netter Ansatz, besser als meine naive Lösung –

+2

@IvoFlipse Es _ist_ die naive Lösung :). Der einzige Unterschied besteht darin, dass Sie Masken verwenden, um die Listen für die Bedingungen zu erstellen, anstatt sie explizit zu erstellen. – Hooked

+0

Oh, warte ich, obwohl es einzelne Werte indiziert hat, verpasste die Zeile, wo Sie eine Maske erstellen, um zu sehen, ob y == yv. Immer noch saubere Lösung :-) –

Verwandte Themen