title: Plotting a solid cylinder centered on a plane in Matplotlib
body: <p>I fit a plane to a bunch of points in 3d and initially gave it an arbitrary size using np.meshgrid, but now I'm trying to plot a cylinder centered on that plane and oriented the same way (such that the plane fit would cut the height of the cylinder in half), but with a specified radius and height. The only examples of cylinders plotted in matplotlib I can find are hollow and usually open at the top and bottom. I want the one I plot to be solid so I can clearly see what points it's enclosing.</p>
  
  <p>Here's a minimum working example with a randomly generated plane. Since the plane I'm using is always given by a point and a normal vector, the cylinder should be based off of those things as well (plus a provided radius, and height to extend above and below the plane).</p>
  
  <pre><code>from __future__ import division #Enables new-style division
  import matplotlib.pyplot as plt
  from mpl_toolkits.mplot3d import Axes3D
  import seaborn as sns
  import numpy as np
  
  cen_x = 0
  cen_y = 0
  cen_z = 0
  
  origin = np.array([cen_x,cen_y,cen_z])
  
  normal = np.array([np.random.uniform(-1,1),np.random.uniform(-1,1),np.random.uniform(0,1)])
  
  a = normal[0]
  b = normal[1]
  c = normal[2]
  
  #equation for a plane is a*x+b*y+c*z+d=0 where [a,b,c] is the normal
  #so calculate d from the normal
  d = -origin.dot(normal)
  
  # create x,y meshgrid
  xx, yy = np.meshgrid(np.arange(cen_x-1,cen_x+1,0.01),np.arange(cen_y-1,cen_y+1,0.01))
  
  # calculate corresponding z
  zz = (-a * xx - b * yy - d) * 1./c
  
  halo_x = [-0.3, -0.9, 0.8, 1.3, -0.1, 0.5]
  halo_y = [0.8, 1.1, -0.5, -0.7, -1.2, 0.1]
  halo_z = [1.0, -0.4, 0.3, -1.2, 0.9, 1.2]
  
  fig = plt.figure(figsize=(9,9))
  plt3d = fig.gca(projection='3d')
  plt3d.plot_surface(xx, yy, zz, color='r', alpha=0.4)
  plt3d.set_xlim3d(cen_x-3,cen_x+3)
  plt3d.set_ylim3d(cen_y-3,cen_y+3)
  plt3d.set_zlim3d(cen_z-3,cen_z+3)
  plt3d.set_xlabel('X')
  plt3d.set_ylabel('Y')
  plt3d.set_zlabel('Z')
  plt.show()
  </code></pre>