mohit bhatia
mohit bhatia

Reputation: 101

Matplotlib function visualtization changing with precision

So I was trying to map out some math functions in 3d using matplotlib when I noticed something... The 3d plot suddenly changed (more like broke) when I tried to fix a previous issue wherein I was encountering some 'missing surface' - a gap in the plot. The main question is this -- Is the 3d plot not showing the two peaks on higher precision due to some inherent computing limitations of Axes3d or some other reason? Also a secondary question -- Why am I encountering 'missing surfaces' near +1.25 and -1.25 in lower precision plot?

I have tried googling for it and referred a few posts but nothing came ot except more questions.

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

    X=np.arange(-2,+2,0.025)
    ## Use np.arange(-5,+5,0.25) to experience the 'surface loss' I mention but otherwise correct 2 spike plot at each of (0,-1) and (0,+1) for both X and Y
    Y=np.arange(-2,+2,0.025)
    X,Y=np.meshgrid(X,Y)
    R=1+X**2-Y**2
    S=R**2+4*(X**2)*(Y**2)
    Z=R/S
    fig=plt.figure()
    ax=Axes3D(fig)
    ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=cm.viridis,norm=mpl.colors.Normalize(vmin=-1.,vmax=1.))
    ##NORMALIZE Was essential to get the proper color range
    plt.show()
    plt.savefig('art3d.jpeg',bbox_inches='tight')
    plt.savefig('art3d.svg',bbox_inches='tight')

The ideal result should be like this (shows the func and the plot) https://i.sstatic.net/kVnYc.png The two plots I'm getting could be seen when the code is run as I can't seem to add images presumably because of low reputation :( Any and all help is appreciated.Thanks in advance.

Upvotes: 1

Views: 162

Answers (1)

ImportanceOfBeingErnest
ImportanceOfBeingErnest

Reputation: 339170

First note that the function in use is different from the wolfram alpha output. So let's use the function shown in the screenshot. Then you can limit the data to the range you want to show.

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

X = np.arange(-2,+2,0.025)
Y=np.arange(-2,+2,0.025)
X,Y=np.meshgrid(X,Y)

Z = -2*X*Y / ((2*X*Y)**2 + (X**2 - Y**2 + 1)**2)

Z[(Z < -1)] = -1
Z[(Z > 1)] = 1

fig=plt.figure()
ax=Axes3D(fig)
ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=cm.viridis,norm=mpl.colors.Normalize(vmin=-1.,vmax=1.))

plt.show()

enter image description here

Upvotes: 1

Related Questions