2011-03-15 11 views
3

私は少し問題があります。私は可能性のために波動関数を描くプログラムを持っており、プロット(ピラッブを使って)でオプションを使うとうまくいくようです - http://img41.imageshack.us/img41/8798/59138635.pngmatplotlib:マーカーを使用すると醜いプロット

私は 'o'を使うと、 http://img16.imageshack.us/img16/3741/22378006.png

あなたはそれが醜いことを参照してください。

\円はもっと間隔をあけ作るための簡単な方法はありますか、それは、コードの詳細に依存するのでしょうか?

コードがある:それは醜い

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() 
+1

私はあなたの質問に答えましたが、あなたのコードに深刻な改善があります。たとえば、 'range'を使う代わりに、numpyの組み込みのベクトル演算を使います。' V = x ** 4'は、これらの3つの行すべてを置き換えることができます。 –

+0

空間的に不均一に分布しているマーカーがある場合は、マーカーのacrlengthパラメータ化が必要になります。これについては、ここで解決します。http://stackoverflow.com/questions/17406758/plotting-a-curve-with-equidistant-arc-length-マーカー –

答えて

6

さらに調査した後、私はより良い(しかし異なる)答えを持っています。 Matplotlibは、マーカーを置く際のストライドを可能にするためにmarkeveryキーワードを提供します。あなたは、視認性のために20かそこらのポイントをしたいのであれば、私は緑の線の上に、推薦する:あなたが唯一のマーカーをしたい場合は

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

私の前の回答が正常に動作しますが、あなたは両方の行をしたい場合、これは非常にうまく機能しますとマーカー。

+0

私はそれを追加し、私が得るものを参照してください:)助けてくれてありがとう^^ –

2

理由は、あなたのグリッドがあまりにも細かくマーカーでプロットするために間隔を置いて配置されていることです。あなたがあなたのラインにマーカーを追加するために行うことができますのみすべての10(または任意の)ポイントにそれらを追加することです:

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

+1 ... @dingo_d:matplotlibを使ってデータをプロットするときに、関数に与えていないことを覚えておいてください。それらの個々の点のそれぞれにマーカーを描きます。したがって、サークルの数を減らしたい場合は、単にmatplotlibに点のスパースリストを与えるだけです。 –