title: Graph a colored cube in matplotlib
body: <p>I work on a statistical code that generates a variety of graphs with Matlab.  The graph types range from simple pie and bar charts to 3D histogram lattices.  </p>
  
  <p>Now we would like a nice GUI to go with the software.  We have a prototype Matlab GUI, but Matlab's GUI has a number of issues, so we'd like to move to a more robust GUI.  My best option seems to be PySide + matplotlib, but so far I haven't found an way to plot the 3D lattice.  The matlab code uses contourslice.  There doesn't seem to be a similar call in matplotlib.  So, can anyone help me figure out how I might get a graph like this with matplotlib?  So far my only idea is to graph 6 surfaces to make a cube.</p>
  
  <p>Actually, recommendations for other GUI/Graph library combinations are also welcome.  The bases stat code is C++, so Python is just one of many options.  Judging from some of the answers I've seen on StackOverflow, matplotlib may be unacceptably slow in 3D.  Perhaps R would be better?</p>
  
  <p><img src="https://i.stack.imgur.com/4pAgv.png" alt="A colored 3D cube made with contourslice"></p>
  
  <p>Here's the matlab code:</p>
  
  <pre><code>clf
  xlo = -1.800000e+01; 
  xhi = 1.000000e+01; 
  ylo = 1.000000e+01; 
  yhi = 3.000000e+01; 
  zlo = -1.000000e+03; 
  zhi = 1.000000e+03; 
  X=zeros(16,16,16);
  Y=zeros(16,16,16);
  Z=zeros(16,16,16);
  V=zeros(16,16,16);
  % fill in X, Y, Z, and V  huge amount of text
  xt = [-1.800000e+01:2.800000e-01:1.000000e+01];
  yt = [1.000000e+01:2.000000e-01:3.000000e+01];
  zt = [-1.000000e+03:2.000000e+01:1.000000e+03];
  isoval = -1.428280e+01;
  h = patch(isosurface(X,Y,Z,V,isoval),... 
  'FaceColor', 'blue', ... 
  'EdgeColor', 'none', ... 
  'AmbientStrength', 0.2, ... 
  'SpecularStrength', 0.7, ... 
  'DiffuseStrength', 0.4);
  isonormals(X,Y,Z,V,h);
  patch(isocaps(X,Y,Z,V,isoval), ...
  'FaceColor', 'interp', ... 
  'EdgeColor', 'none'); 
  axis([xlo xhi ylo yhi zlo zhi])
  daspect([2.800000e+01,2.000000e+01,2.000000e+03])
  set(gca,'linewidth',2)
  set(gca,'fontweight','bold')
  set(gca,'fontsize',12)
  grid on
  box on
  colormap('default'); colorbar
  
  view(3) 
  set(gcf,'Renderer','zbuffer')
  lighting phong
  cin = 'n';
  if (cin == 'y')
  xin = questdlg('Axis to slide through ?', 'Axis', 'X', 'Y', 'Z', 'X');
  xin = lower(xin);
  for i = 1 : 101
  if gcf ~= plotFigure
  return
  end
  if (xin == 'y')
  h = contourslice(X,Y,Z,V,xt(i),[],[],101);
  elseif (xin == 'x')
  h = contourslice(X,Y,Z,V,[],yt(i),[],101);
  elseif (xin == 'z')
  h = contourslice(X,Y,Z,V,[],[],zt(i),101);
  end
  axis([-1.8000e+01  1.0000e+01  1.0000e+01  3.0000e+01 -1.0000e+03  1.0000e+03 -8.6774e+01  4.2066e+02])
  set(gca,'linewidth',2)
  set(gca,'fontweight','bold')
  set(gca,'fontsize',12)
  grid on
  box on
  view(3)
  set(h, 'Linewidth', 10)
  colorbar
  pause(0.3)
  if (i &lt; 101)
  clf
  end
  end
  end
  </code></pre>