Pertanyaan bagaimana merencanakan pada skala yang lebih kecil


Saya menggunakan matplotlib dan saya menemukan beberapa masalah ketika mencoba memplot vektor besar. terkadang mendapatkan "MemoryError" Pertanyaan saya adalah apakah ada cara untuk mengurangi skala nilai yang harus saya plot?

enter image description here

Dalam contoh ini saya sedang merencanakan vektor dengan ukuran 2647296!

adakah cara untuk memplot nilai yang sama dalam skala yang lebih kecil?


4
2018-03-23 14:43


asal


Jawaban:


Sangat tidak mungkin Anda memiliki begitu banyak resolusi di layar Anda sehingga Anda dapat melihat 2,6 juta titik data di plot Anda. Cara sederhana untuk memplot lebih sedikit data adalah dengan mengambil sampel mis. setiap 1000 poin: plot(x[::1000]). Jika kehilangan terlalu banyak dan itu mis. penting untuk melihat nilai-nilai ekstrem, Anda dapat menulis beberapa kode untuk memecah vektor panjang ke dalam banyak bagian yang sesuai dan mengambil minimum dan maksimum setiap bagian, dan memplotnya:

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

9
2018-03-23 15:25



Anda dapat menggunakan min / max untuk setiap blok data untuk subsampel sinyal.

Ukuran jendela harus ditentukan berdasarkan seberapa akurat Anda ingin menampilkan sinyal Anda dan / atau seberapa besar jendela dibandingkan dengan panjang sinyal.

Kode contoh:

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

Keluaran: enter image description here


1
2018-03-24 09:48