如何在较小的范围内绘图

时间:2012-03-23 14:43:39

标签: python matplotlib

我正在使用matplotlib,我在尝试绘制大型矢量时发现了一些问题。 有时得到“MemoryError” 我的问题是,是否有任何方法可以减少我需要绘制的值的规模?

enter image description here

在这个例子中,我正在绘制一个大小为2647296的矢量!

有没有办法以较小的比例绘制相同的值?

2 个答案:

答案 0 :(得分:9)

您的显示器上的分辨率太高,您可以在绘图中看到260万个数据点。绘制较少数据的简单方法是例如每1000分:plot(x[::1000])。如果失去太多而且例如重要的是要看到极值,你可以编写一些代码将长向量分成适当的多个部分,并取每个部分的最小值和最大值,然后绘制:

tmp = x[:len(x)-len(x)%1000] # drop some points to make length a multiple of 1000
tmp = tmp.reshape((1000,-1)) # split into pieces of 1000 points
tmp = tmp.reshape((-1,1000)) # alternative: split into 1000 pieces
figure(); hold(True)         # plot minimum and maximum in the same figure
plot(tmp.min(axis=0))
plot(tmp.max(axis=0))

答案 1 :(得分:1)

您可以使用每个数据块的最小值/最大值对信号进行二次采样。

窗口大小必须根据您希望显示信号的准确程度和/或窗口与信号长度的比较来确定。

示例代码:

from scipy.io import wavfile
import matplotlib.pyplot as plt

def value_for_window_min_max(data, start, stop):
    min = data[start]
    max = data[start]

    for i in range(start,stop):
        if data[i] < min:
            min = data[i]
        if data[i] > max:
            max = data[i]

    if abs(min) > abs(max):
        return min
    else:
        return max

# This will only work properly if window_size divides evenly into len(data)
def subsample_data(data, window_size):
    print len(data)
    print len(data)/window_size

    out_data = []

    for i in range(0,(len(data)/window_size)):
        out_data.append(value_for_window_min_max(data,i*window_size,i*window_size+window_size-1))

    return out_data


sample_rate, data = wavfile.read('<path_to_wav_file>')

sub_amt = 10
sub_data = subsample_data(data, sub_amt)

print len(data)
print len(sub_data)

fig = plt.figure(figsize=(8,6), dpi=100)
fig.add_subplot(211)
plt.plot(data)
plt.title('Original')
plt.xlim([0,len(data)])
fig.add_subplot(212)
plt.plot(sub_data)
plt.xlim([0,len(sub_data)])
plt.title('Subsampled by %d'%sub_amt)
plt.show()

输出: enter image description here