21

I am looking for a way to create four-dimensional plots (surface plus a color scale) using Python and matplotlib. I am able to generate the surface using the first three variables, but I am not having success adding the color scale for the fourth variable. Here is a small subset of my data below. Any help would be greatly appreciated. Thanks

Data Subset

var1    var2    var3    var4
10.39   73.32   2.02    28.26
11.13   68.71   1.86    27.83
12.71   74.27   1.89    28.26
11.46   91.06   1.63    28.26
11.72   85.38   1.51    28.26
13.39   78.68   1.89    28.26
13.02   68.02   2.01    28.26
12.08   64.37   2.18    28.26
11.58   60.71   2.28    28.26
8.94    65.67   1.92    27.04
11.61   59.57   2.32    27.52
19.06   74.49   1.69    63.35
17.52   73.62   1.73    63.51
19.52   71.52   1.79    63.51
18.76   67.55   1.86    63.51
19.84   53.34   2.3     63.51
20.19   59.82   1.97    63.51
17.43   57.89   2.05    63.38
17.9    59.95   1.89    63.51
18.97   57.84   2       63.51
19.22   57.74   2.05    63.51
17.55   55.66   1.99    63.51
19.22   101.31  6.76    94.29
19.41   99.47   6.07    94.15
18.99   94.01   7.32    94.08
19.88   103.57  6.98    94.58
19.08   95.38   5.66    94.14
20.36   100.43  6.13    94.47
20.13   98.78   7.37    94.47
20.36   89.36   8.79    94.71
20.96   84.48   8.33    94.01
21.02   83.97   6.78    94.72
19.6    95.64   6.56    94.57
Avaris
  • 35,883
  • 7
  • 81
  • 72
Chris
  • 281
  • 2
  • 3
  • 7
  • Sorry, the data did not format properly. It should read: – Chris Oct 21 '11 at 21:00
  • var1 10.39 11.13 12.71 11.46 11.72 13.39 13.02 12.08 11.58 8.94 11.61 19.06 17.52 19.52 18.76 19.84 20.19 17.43 17.9 18.97 19.22 17.55 19.22 19.41 18.99 19.88 19.08 20.36 20.13 20.36 20.96 21.02 19.6 – Chris Oct 21 '11 at 21:01
  • var2 73.32 68.71 74.27 91.06 85.38 78.68 68.02 64.37 60.71 65.67 59.57 74.49 73.62 71.52 67.55 53.34 59.82 57.89 59.95 57.84 57.74 55.66 101.31 99.47 94.01 103.57 95.38 100.43 98.78 89.36 84.48 83.97 95.64 – Chris Oct 21 '11 at 21:01
  • var3 2.02 1.86 1.89 1.63 1.51 1.89 2.01 2.18 2.28 1.92 2.32 1.69 1.73 1.79 1.86 2.3 1.97 2.05 1.89 2 2.05 1.99 6.76 6.07 7.32 6.98 5.66 6.13 7.37 8.79 8.33 6.78 6.56 – Chris Oct 21 '11 at 21:02
  • var4 28.26 27.83 28.26 28.26 28.26 28.26 28.26 28.26 28.26 27.04 27.52 63.35 63.51 63.51 63.51 63.51 63.51 63.38 63.51 63.51 63.51 63.51 94.29 94.15 94.08 94.58 94.14 94.47 94.47 94.71 94.01 94.72 94.57 – Chris Oct 21 '11 at 21:02
  • 5
    Chris, instead of adding comments, can you edit your post? To make the data come out as you expect, use the code formatting (highlight it and press the button that looks like curly brackets). Also, post what code you have so far. You're much more likely to get a good response if you do so. – Wilduck Oct 21 '11 at 21:27
  • Have you tried looking at [this](http://matplotlib.sourceforge.net/examples/mplot3d/surface3d_demo.html) link? The screenshots and thumbnails are a really good way to learn about matplotlib's capabilities. – cosmosis Oct 21 '11 at 21:44
  • Does this answer your question? [(python) plot 3d surface with colormap as 4th dimension, function of x,y,z](https://stackoverflow.com/questions/32461452/python-plot-3d-surface-with-colormap-as-4th-dimension-function-of-x-y-z) – Mr. T Mar 05 '21 at 11:09

1 Answers1

16

To create the plot you want, we need to use matplotlib's plot_surface to plot Z vs (X,Y) surface, and then use the keyword argument facecolors to pass in a new color for each patch.

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm

# create some fake data
x = y = np.arange(-4.0, 4.0, 0.02)
# here are the x,y and respective z values
X, Y = np.meshgrid(x, y)
Z = np.sinc(np.sqrt(X*X+Y*Y))
# this is the value to use for the color
V = np.sin(Y)

# create the figure, add a 3d axis, set the viewing angle
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.view_init(45,60)

# here we create the surface plot, but pass V through a colormap
# to create a different color for each patch
ax.plot_surface(X, Y, Z, facecolors=cm.Oranges(V))

enter image description here

James
  • 32,991
  • 4
  • 47
  • 70