Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python matplotlib:使用标记时的丑陋打印_Python_Matplotlib - Fatal编程技术网

Python matplotlib:使用标记时的丑陋打印

Python matplotlib:使用标记时的丑陋打印,python,matplotlib,Python,Matplotlib,我有个小问题。我有一个程序,可以画一个势函数的波函数,当我使用plot中的选项(使用pylab)“-”时,它看起来很好,例如: 如果我使用“o”,我将得到: 你看它看起来很丑:\ 是否有一种简单的方法可以使圆圈的间距更大,或者这取决于代码的细节 代码是: from math import * from scipy.special import * from pylab import * from scipy.linalg import * firebrick=(178./255.,34./2

我有个小问题。我有一个程序,可以画一个势函数的波函数,当我使用plot中的选项(使用pylab)“-”时,它看起来很好,例如:

如果我使用“o”,我将得到:

你看它看起来很丑:\

是否有一种简单的方法可以使圆圈的间距更大,或者这取决于代码的细节

代码是:

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

它看起来难看的原因是栅格的间距太小,无法使用标记进行打印。向直线添加标记的方法是,仅将标记添加到每10个点(或任意点):


在进一步调查之后,我有了一个更好(但不同)的答案。Matplotlib提供了一个
markevery
关键字,允许在放置标记时跨步。因此,我建议,如果你想要20点左右的能见度,在绿线上方:

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

如果您只需要标记,我前面的回答很好,但是如果您同时需要行和标记,这会更好。

我回答了您的问题,但是您可以对代码进行一些重大改进。例如,不要使用
range
,而是使用numpy的内置向量运算:
V=x**4
可以替换所有这三行。如果标记在空间上分布不均匀,则需要标记的acrlength参数化,这在这里解决:+1@dingo_d:请记住,当您使用matplotlib绘制数据时,您并没有给它一个函数,而是给它一个离散的点列表。它将在每个单独的点上绘制一个标记。因此,如果你想看到更少的圆,只需给matplotlib一个更稀疏的点列表。我将添加它,看看我得到了什么:)谢谢你的帮助^^
stride = max( int(len(x) / 20), 1)
plt.plot(x,wave,"-o",color='forestgreen', markevery=stride)