2012-05-13 4 views
12

Wie erstelle ich im folgenden Code Linien, die jedes Paar von Streudiagrammen verbinden (dh den grünen Kreis mit dem gelben Pfeilkopf verbinden), die von den beiden Codezeilen erzeugt werden das Ende kurz vor der .show() Anweisung?Verbinden von zwei Punkten in einem 3D-Punktdiagramm in Python und Matplotlib

import matplotlib.pyplot 
from mpl_toolkits.mplot3d import Axes3D 

dates  = [20020514, 20020515, 20020516, 20020517, 20020520] 
highs  = [1135, 1158, 1152, 1158, 1163] 
lows  = [1257, 1253, 1259, 1264, 1252] 
upperLimits = [1125.0, 1125.0, 1093.75, 1125.0, 1125.0] 
lowerLimits = [1250.0, 1250.0, 1156.25, 1250.0, 1250.0] 

zaxisvalues0= [0, 0, 0, 0, 0] 
zaxisvalues1= [1, 1, 1, 1, 1] 
zaxisvalues2= [2, 2, 2, 2, 2] 

fig = matplotlib.pyplot.figure() 
ax = fig.add_subplot(111, projection = '3d') 

ax.plot(dates, zaxisvalues1, lowerLimits, color = 'b') 
ax.plot(dates, zaxisvalues2, upperLimits, color = 'r') 

ax.scatter(dates, zaxisvalues0, highs, color = 'g', marker = "o") 
ax.scatter(dates, zaxisvalues0, lows, color = 'y', marker = "^") 

matplotlib.pyplot.show() 

Antwort

17

ein Liniensegment zwischen diesen Punkten Draw:

import matplotlib.pyplot 
from mpl_toolkits.mplot3d import Axes3D 

dates  = [20020514, 20020515, 20020516, 20020517, 20020520] 
highs  = [1135, 1158, 1152, 1158, 1163] 
lows  = [1257, 1253, 1259, 1264, 1252] 
upperLimits = [1125.0, 1125.0, 1093.75, 1125.0, 1125.0] 
lowerLimits = [1250.0, 1250.0, 1156.25, 1250.0, 1250.0] 

zaxisvalues0= [0, 0, 0, 0, 0] 
zaxisvalues1= [1, 1, 1, 1, 1] 
zaxisvalues2= [2, 2, 2, 2, 2] 

fig = matplotlib.pyplot.figure() 
ax = fig.add_subplot(111, projection = '3d') 

ax.plot(dates, zaxisvalues1, lowerLimits, color = 'b') 
ax.plot(dates, zaxisvalues2, upperLimits, color = 'r') 

for i,j,k,h in zip(dates,zaxisvalues0,lows,highs): 
    ax.plot([i,i],[j,j],[k,h],color = 'g') 

ax.scatter(dates, zaxisvalues0, highs, color = 'g', marker = "o") 
ax.scatter(dates, zaxisvalues0, lows, color = 'y', marker = "^") 

matplotlib.pyplot.show() 

Produziert:

enter image description here

+0

Superb! Danke, Mark. Ich habe nie realisiert, dass ich einzelne Punkte nach Belieben darstellen kann (anstatt einer Reihe von in einer Reihe oder Liste). Was nun, wenn ich ein Rechteck statt einer Linie zeichnen wollte? Ich habe versucht, "ax.plot" in "ax.bar" in Ihrer "for" -Schleife zu ändern, aber ich habe stattdessen schiefe Linien. Gibt es eine Möglichkeit, ein Rechteck zu zeichnen? Danke im Voraus. – Zambi

+3

@Zambi Willkommen bei Stackoverflow! Anstatt zusätzliche Fragen anzugehen, ist es sinnvoller, hier eine neue Frage zu stellen. – Hooked

+0

Zambi, wie @Hooked sagte, ist es am besten, eine neue Frage zu öffnen, damit die größere Gemeinschaft sie sehen kann. Ein kurzer Blick, aber Sie haben zwei Möglichkeiten, zeichnen Sie die 4 Seiten des Rechtecks ​​mit "Plot" -Linien oder schauen Sie sich mit PolyCollection (http://matplotlib.sourceforge.net/examples/mplot3d/polys3d_demo.html) – Mark