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')
精彩评论