Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.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_Matlab_Matplotlib_Optimization_Plot - Fatal编程技术网

Python matplotlib干图的优化

Python matplotlib干图的优化,python,matlab,matplotlib,optimization,plot,Python,Matlab,Matplotlib,Optimization,Plot,我正在尝试使用“matplotlib.pyplot.Stem”函数生成Stem图。代码可以工作,但需要5分钟以上的时间来处理 我在Matlab中有一个类似的代码,它几乎可以立即用相同的输入数据生成相同的图 有没有一种方法可以优化这个代码的速度或更好的功能,我可以使用 干图“H”和“plotdata”的参数为16384 x 1数组 def stemplot(): 将numpy作为np导入 从scipy.fftpack导入fft 将matplotlib.pyplot作为plt导入 #########

我正在尝试使用“matplotlib.pyplot.Stem”函数生成Stem图。代码可以工作,但需要5分钟以上的时间来处理

我在Matlab中有一个类似的代码,它几乎可以立即用相同的输入数据生成相同的图

有没有一种方法可以优化这个代码的速度或更好的功能,我可以使用

干图“H”和“plotdata”的参数为16384 x 1数组

def stemplot():
将numpy作为np导入
从scipy.fftpack导入fft
将matplotlib.pyplot作为plt导入
################################################
#用于设置绘图数据的代码
N=2048
dr=100
k=np.arange(0,N)
cos=np.cos
pi=np.pi
w=1-1.932617*cos(2*pi*k/(N-1))+1.286133*cos(4*pi*k/(N-1))-0.387695*cos(6*pi*k/(N-1))+0.0322227*cos(8*pi*k/(N-1))
y=np.串联([w,np.零((7*N))]))
H=abs(fft(y,轴=0))
H=np.fft.fft移位(H)
H=H/最大值(H)
H=20*np.log10(H)
H=dr+H
H[H<0]=0#将dr+H中的所有负值设置为0
plotdata=((名词短语arange(1,(8*N)+1,1))-1-4*N)/8
#################################################
#绘图代码
plt.图
plt.stem(plotdata,H,markerfmt=“”)
plt.轴([(-4*N)/8,(4*N)/8,0,dr])
plt.grid()
plt.ylabel(“分贝”)
plt.xlabel(“DFT箱”)
产品名称(‘频率响应(平顶)’)
plt.show()
返回
以下是供参考的Matlab代码:

N=2048;
dr=100;
k=0:N-1
w=1-1.932617*cos(2*pi*k/(N-1))+1.286133*cos(4*pi*k/(N-1))-0.387695*cos(6*pi*k/(N-1))+0.0322227*cos(8*pi*k/(N-1));
H=abs(fft([w零点(1,7*N)]);
H=FFT换档(H);
H=H/最大值(H);
H=20*log10(H);
H=最大值(0,dr+H);%将dr+H中的负数设置为0
图形
茎(([1:(8*N)]-1-4*N)/8,H',-');
集合(findobj('Type','line'),'Marker','none','Color',[.871.49 0])
xlim([-4*N 4*N]/8)
ylim([0 dr])
设置(gca,'YTickLabel','-100 |-90 |-80 |-70 |-60 |-50 |-40 |-30 |-20 |-10 | 0')
网格化
伊拉贝尔(“分贝”)
xlabel(‘DFT箱’)
标题(“频率响应(平顶)”

这里似乎不需要绘制
干图,因为标记无论如何都是不可能的,并且由于点的数量太多而没有意义

相反,使用LineCollection可能有意义。这是无论如何-看。下面的代码在0.25秒内运行。(由于行数太多,这仍然比使用
绘图
略长。)

将numpy导入为np
从scipy.fftpack导入fft
将matplotlib.pyplot作为plt导入
导入时间
将matplotlib.collections作为mcoll导入
N=2048
k=np.arange(0,N)
dr=100
cos=np.cos
pi=np.pi
w=1-1.932617*cos(2*pi*k/(N-1))+1.286133*cos(4*pi*k/(N-1))-0.387695*cos(6*pi*k/(N-1))+0.0322227*cos(8*pi*k/(N-1))
y=np.串联([w,np.零((7*N))]))
H=abs(fft(y,轴=0))
H=np.fft.fft移位(H)
H=H/最大值(H)
H=20*np.log10(H)
H=dr+H
H[H<0]=0#将dr+H中的所有负值设置为0
plotdata=((名词短语arange(1,(8*N)+1,1))-1-4*N)/8
行=[]
对于thisx,zip中的thisy(绘图数据,H):
追加(((thisx,0),(thisx,thisy)))
stemlines=mcoll.LineCollection(线条,线条样式=“-”,
colors=“C0”,标签=“”“无标签”)
plt.gca().add_集合(stemlines)
plt.轴([(-4*N)/8,(4*N)/8,0,dr])
plt.grid()
plt.ylabel(“分贝”)
plt.xlabel(“DFT箱”)
产品名称(‘频率响应(平顶)’)
plt.show()

您可以使用
ax.vlines
以所需的格式模拟茎图。写一个小函数

def make_stem(ax, x, y, **kwargs):
    ax.axhline(x[0],x[-1],0, color='r')

    ax.vlines(x, 0, y, color='b')

    ax.set_ylim([1.05*y.min(), 1.05*y.max()])
然后修改示例中的相关行,如下所示:

    # Plotting Code

##    plt.figure
##    plt.stem(plotdata,H,markerfmt = " ")

##    plt.axis([(-4*N)/8, (4*N)/8, 0, dr])

    fig, ax = plt.subplots()
    make_stem(ax, plotdata, H)

几乎立即生成绘图。然而,我不知道这比@ImportanceOfBeingErnest的答案快还是慢。

你能把这变成一个问题吗?如果不知道
w
是什么,则无法运行此代码。此外,
return
是一条语句,而不是函数。它后面不需要
()
。在这种特殊情况下根本不需要;-)请看一看和github问题。这似乎是一个已知的问题。我可以重复第二期中的一个评论:16384分,你确定干图就是你想要的吗?你又一次打败了我:)我用
vlines
得到了一个解决方案,它也非常快。@Thomas如果你的解决方案使用的不是线收集,如果它比问题开始的5秒要快得多,为什么不在这里发布呢?完成了。不过我不知道如何更快。谢谢你的回复,代码比.stem方法工作得更好!我想最初我只是想直接翻译matlab代码,在这个例子中,直接比较不是最好的解决方案。下面的解决方案需要0.25秒,而这个解决方案在我的计算机上需要0.23秒。差别不大,但显然还是快了一点。@Thomas谢谢你的回答,我测试了这段代码,它的运行速度和上面的一样快,任何一种方法都是合适的。@Stevengodard然后你就可以有两种可行的解决方案了。你可以选择你更喜欢的。
    # Plotting Code

##    plt.figure
##    plt.stem(plotdata,H,markerfmt = " ")

##    plt.axis([(-4*N)/8, (4*N)/8, 0, dr])

    fig, ax = plt.subplots()
    make_stem(ax, plotdata, H)