Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

color of a 3D surface plot in python

I'm using following line for plotting a 3D surface:

surf = ax3.plot_surface(X, Y, Z, rstride=1, cstride=1, alpha=0.5, linewidth=0, cmap=cm.jet,antialiased=True)

Now the color comes very nice, although a bit scaly appearance, though fine.
But I want to change the surface color w.r.t. another data, stored in list as:

m = [104.48, 111.73,109.93,139.95,95.05,150.49,136.96,157.75]

I was trying with:

norm = cls.Normalize() # Norm to map the 'm' values to [0,1]
norm.autoscale(m)
cmap = cm.ScalarMappable(norm, 'jet')
surf = ax3.plot_surface(X, Y, Z, rstride=5, cstride=5, alpha=0.5, linewidth=0, color=cmap.to_rgba(m), antialiased=True)

But this is raising an error as cmap.to_rgba takes 1D arrays only. Any suggestions on how can I be able to change the colormap of the surface would be highly appreciated.

like image 413
diffracteD Avatar asked Sep 05 '15 13:09

diffracteD


1 Answers

Well, it looks awful but I think you can adapt it:

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
my_col = cm.jet(np.random.rand(Z.shape[0],Z.shape[1]))

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors = my_col,
        linewidth=0, antialiased=False)
ax.set_zlim(-1.01, 1.01)

result plot I would not use jet but some linear colormap like cubehelix. You can trick the eye easily using the wrong colormap (one of many posts on that topic)

like image 167
Moritz Avatar answered Sep 28 '22 02:09

Moritz