Connecting two points in a 3D scatter plot in Python and matplotlib

26,109

Draw a line segment between those points:

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()

Produces:

enter image description here

Share:
26,109
Zambi
Author by

Zambi

Updated on May 14, 2020

Comments

  • Zambi
    Zambi almost 4 years

    In the code below, how do I create lines connecting each pair of scatter plots (i.e. linking the green circle to the yellow arrowhead) created by the two lines of code towards the end just before the .show() instruction?

    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()
    
  • Zambi
    Zambi almost 12 years
    Superb! Thanks, Mark. I never realized I can plot individual points at will (instead of a series of in an array or list). Now what if I wanted to draw a rectangle instead of a line? I tried changing "ax.plot" to "ax.bar" in your "for" loop but I got skewed lines instead. Is there a way to draw a rectangle? Thanks in advance.
  • Hooked
    Hooked almost 12 years
    @Zambi Welcome to Stackoverflow! Rather than tack on extra questions, it makes more sense here to ask a new question.
  • Mark
    Mark almost 12 years
    Zambi, as @Hooked said, it's best to open a new question so the larger community can see it. A quick looks though, you have two options, draw the 4 sides of the rectangle with "plot" lines or look into using PolyCollection (matplotlib.sourceforge.net/examples/mplot3d/polys3d_demo.ht‌​ml)
  • Zambi
    Zambi almost 12 years
    Hooked and Mark thanks. A new question has been posted. (stackoverflow.com/questions/10599942/…)