matplotlib茎图的优化

发布于 2021-01-29 16:38:26

我正在尝试使用’matplotlib.pyplot.stem’函数生成一个茎图。该代码可以运行,但是需要5分钟以上的时间来处理。

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

有没有一种方法可以优化此代码以获得更快的速度或更好的功能?

干图’H’和’plotdata’的参数为16384 x 1数组。

def stemplot():

    import numpy as np
    from scipy.fftpack import fft
    import matplotlib.pyplot as plt

    ################################################
    # Code to set up the plot data

    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.concatenate([w, np.zeros((7*N))])

    H = abs(fft(y, axis = 0))
    H = np.fft.fftshift(H)
    H = H/max(H)
    H = 20*np.log10(H)
    H = dr+H 
    H[H < 0] = 0        # Set all negative values in dr+H to 0

    plotdata = ((np.arange(1,(8*N)+1,1))-1-4*N)/8
    #################################################

    # Plotting Code

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

    plt.axis([(-4*N)/8, (4*N)/8, 0, dr])    
    plt.grid()
    plt.ylabel('decibels')
    plt.xlabel('DFT bins')
    plt.title('Frequency response (Flat top)')
    plt.show()


    return

这也是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 zeros(1,7*N)]));
H = fftshift(H);
H = H/max(H);
H = 20*log10(H);
H = max(0,dr+H); % Sets negative numbers in dr+H to 0


figure
stem(([1:(8*N)]-1-4*N)/8,H,'-');
set(findobj('Type','line'),'Marker','none','Color',[.871 .49 0])
xlim([-4*N 4*N]/8)
ylim([0 dr])
set(gca,'YTickLabel','-100|-90|-80|-70|-60|-50|-40|-30|-20|-10|0')
grid on
ylabel('decibels')
xlabel('DFT bins')
title('Frequency response (Flat top)')
关注者
0
被浏览
42
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这里似乎不需要stem绘图,因为无论如何标记都是看不见的,并且由于点太多而没有意义。

    而是使用LineCollection可能有意义。无论如何,这就是matplotlib在将来的版本中将如何执行-请参阅此PR。下面的代码对我来说在0.25秒内运行。(plot由于行数很多,这仍然比使用稍长。)

    import numpy as np
    from scipy.fftpack import fft
    import matplotlib.pyplot as plt
    import time
    import matplotlib.collections as 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.concatenate([w, np.zeros((7*N))])
    
    H = abs(fft(y, axis = 0))
    H = np.fft.fftshift(H)
    H = H/max(H)
    H = 20*np.log10(H)
    H = dr+H 
    H[H < 0] = 0        # Set all negative values in dr+H to 0
    
    plotdata = ((np.arange(1,(8*N)+1,1))-1-4*N)/8
    
    
    lines = []
    for thisx, thisy in zip(plotdata,H):
        lines.append(((thisx, 0), (thisx, thisy)))
    stemlines = mcoll.LineCollection(lines, linestyles="-",
                        colors="C0", label='_nolegend_')
    plt.gca().add_collection(stemlines)
    
    
    plt.axis([(-4*N)/8, (4*N)/8, 0, dr])    
    plt.grid()
    plt.ylabel('decibels')
    plt.xlabel('DFT bins')
    plt.title('Frequency response (Flat top)')
    
    plt.show()
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看