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.
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)
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With