matplotlib:使用标记时图形丑陋

3 投票
2 回答
3975 浏览
提问于 2025-04-16 13:46

我遇到了一点小问题。我有一个程序可以绘制一个潜在的波函数,当我在绘图时使用选项,比如用pylab中的'-',效果看起来不错。例如:http://img41.imageshack.us/img41/8798/59138635.png

但是如果我用'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()

2 个回答

2

之所以看起来不好看,是因为你的网格间距太小,不适合用标记来绘图。你可以做的就是只在每10个点(或者其他你选择的间隔)上添加标记,这样会更好看一些:

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

经过进一步调查,我有了一个更好(但不同)的答案。Matplotlib 提供了一个 markevery 关键字,可以让你在放置标记时设置间隔。所以我建议,如果你想要大约 20 个点来提高可见性,可以在绿色线条上加上这些点:

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

我之前的答案如果你只想要标记是可以的,但如果你想同时显示线条和标记,这个方法效果会更好。

撰写回答