开发者

matplotlib: ugly plots when using markers

I have a little problem. I have a program that will draw wave function for a pote开发者_Python百科ntial, and it looks fine when I use the option in plot (using pylab) '-' for instance: http://img41.imageshack.us/img41/8798/59138635.png

If I use 'o' i'll get: http://img16.imageshack.us/img16/3741/22378006.png

You see that it looks ugly :\

Is there a simple way to make the circles more spaced, or does that depends on the details of the code?

The code is:

from math import *
from scipy.special import *
from pylab import *
from scipy.linalg import *

firebrick=(178./255.,34./255.,34./255.)
indianred=(176./255.,23./255.,31./255.)
steelblue=(70./255.,130./255.,180./255.)
slategray1=(198./255.,226./255.,255./255.)
slategray4=(108./255.,123./255.,139./255.)
lavender=(230./255.,230./255.,230./255.)
cobalt=(61./255.,89./255.,171./255.)
midnightblue=(25./255.,25./255.,112./255.)
forestgreen=(34./255.,139./255.,34./255.)

#grid
Nmesh=512
L=4.0
dx=L/Nmesh
Xmax=L
x=arange(-L,L+0.0001,dx)
Npts=len(x)
numwav=2   #number of wave function that is being drawn

V=zeros([Npts],float)
for i in range(Npts):
    V[i]=x[i]**4

a=zeros([2,Npts-2],float)
wave=zeros([Npts],float)

wave1=zeros([Npts],float)
encor=3.0/4*(3.0/4)**(1.0/3)

#numerical solution
for i in range(1,Npts-1,1):
    a[0,i-1]= 1.0/dx**2+V[i]     #diagonal elements
    a[1,i-1]=-1.0/dx**2/2        #the elements below the diagonal
a[1,Npts-3]=-99.0                #element is not used
eig,vec=eig_banded(a,lower=1)    #routine that diagonalizes the tridiagonal matrix

for i in range(1,Npts-1,1):
    wave[i]=vec[i-1,numwav]
wave[0]=0.0             #wave function has the value zero on the first point on the grid
wave[Npts-1]=0.0        #wave function has the value zero on the last point on the grid

wave=150*wave+eig[numwav]

#potential graph
line=plt.plot(x,V)
plt.setp(line,color='firebrick',linewidth=2)

#plot of the selected level and wave function
plt.axhline(y=eig[numwav],linewidth=2,color='steelblue')

#plot of the points of the wave function
plt.plot(x,wave,"b-",linewidth=2,color='forestgreen')

plt.xlabel('x',size=16)
plt.ylabel('V(x)',size=16)
plt.axis([-4.0,4.0,-5.0,16.0]) #x and y axes range
plt.grid(True)
plt.show()


After investigating further, I have a better (but different) answer. Matplotlib provides a markevery keyword to allow a stride in placing markers. So I would recommend, if you want 20 or so points for visibility, on top of a green line:

stride = max( int(len(x) / 20), 1)
plt.plot(x,wave,"-o",color='forestgreen', markevery=stride)

My previous answer works fine if you only want markers, but this works much better if you want both lines and markers.


The reason it looks ugly is that your grid is too finely spaced for plotting with markers. What you can do to add markers to your line is to only add them to every 10 (or whatever) points:

plt.plot(x[::10],wave[::10],"o",color='forestgreen')
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜