2

I'm able to plot a surface in 3d in matplotlib, but I also need to plot a line, and a point on the surface. The surface that the line are fine, but the point does not show up on the surface for some reason, though. Here is the code:

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

fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(-2.0, 2.0, 0.05)
Y = np.arange(-1.0, 3.0, 0.05)
X, Y = np.meshgrid(X, Y)
Z = (np.ones([np.shape(X)[0],np.shape(X)[1]])-X)**2+100*(Y-(X)**2)**2
Gx, Gy = np.gradient(Z) # gradients with respect to x and y
G = (Gx**2+Gy**2)**.5  # gradient magnitude
N = G/G.max()  # normalize 0..1
surf = ax.plot_surface(
    X, Y, Z, rstride=1, cstride=1,
    facecolors=cm.jet(N),
    linewidth=0, 
    antialiased=False, 
    shade=False)

plt.hold(True)
ax.hold(True)

# add the unit circle

x_1 = np.arange(-1.0, 1.0, 0.005)
x_2 = np.arange(-1.0, 1.0, 0.005)

y_1 = np.sqrt(np.ones(len(x_1)) - x_1**2)
y_2 = -np.sqrt(np.ones(len(x_2)) - x_2**2)

x = np.array(x_1.tolist() + x_2.tolist())
y = np.array(y_1.tolist() + y_2.tolist())

z = (np.ones(len(x))-x)**2+100*(y-(x)**2)**2

ax.plot(x, y, z, '-k')

plt.hold(True)
ax.hold(True)

ax.scatter(np.array([0.8]),
           np.array([0.6]),
           np.array([0.045]), 
           color='red',
           s=40
        )

# Get current rotation angle
print 'rotation angle is ', ax.azim

# Set rotation angle to 60 degrees
ax.view_init(azim=60)

plt.xlabel('x')
plt.ylabel('y')
plt.show()

The issue is that the point does not show up on the surface. Now, when I replace this code:

ax.scatter(np.array([0.8]),
           np.array([0.6]),
           np.array([0.045]), 
           color='red',
           s=40
        )

...with this code (i.e. just adding to the last value)...

ax.scatter(np.array([0.8]),
           np.array([0.6]),
           np.array([0.045+800]), 
           color='red',
           s=40
        )

...then it shows up. But I can't think of a reason why it is not showing up when I want to plot the actual value in the surface. Does someone know how to fix this?

(As an aside, I'd love to get rid of the weird line in the middle of the unit circle that I plot on the surface. I can't seem to get rid of it.)

Much obliged!

makansij
  • 9,303
  • 37
  • 105
  • 183
  • See https://stackoverflow.com/questions/14824893/how-to-draw-intersecting-planes/14825951#14825951 mpl's 3D + intersecting surfaces do not work will together. – tacaswell Sep 25 '16 at 00:53
  • But, I'm not trying to intersect two surfaces, I'm just trying to highlight one point in the surface...unless you think it's the same problem? – makansij Sep 26 '16 at 17:15

0 Answers0