无法将绘图重新创建为numpy数组?

时间:2017-05-18 12:13:25

标签: python numpy matplotlib plot

我目前正在尝试创建一个类似于情节的numpy ......

MVCE:

#
#   MVCE version
#


import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from PIL import Image
import librosa
import librosa.display
from matplotlib import cm
from sklearn import preprocessing
import ast
import urllib
import os
import sys
from os import listdir
from os.path import isfile, join

min_max_scaler = preprocessing.MinMaxScaler(feature_range=(0,1))

def make_plot_store_data(name,interweaved,static,delta,delta_delta,isTrain,isTest,isDev):

    print static.shape
    print type(static)
    print np.min(static)
    print np.max(static)
    fig = plt.figure()

    librosa.display.specshow(static.T,sr=16000,x_axis='frames',y_axis='mel',hop_length=160,cmap=cm.jet)
    #plt.axis('off')
    plt.title("log mel power spectrum of " + name)
    plt.colorbar(format='%+02.0f dB')
    plt.tight_layout()

    if isTrain == True:
        plt.figure()
        convert = plt.get_cmap(cm.jet)
        numpy_output_static = convert(min_max_scaler.fit_transform(np.flipud(static.T)))
        plt.imshow(numpy_output_static,aspect = 'auto')
        plt.show()
        raw_input("sadas")

link = "https://gist.githubusercontent.com/Miail/51311b34f5e5333bbddf9cb17c737ea4/raw/786b72477190023e93b9dd0cbbb43284ab59921b/feature.txt"
f = urllib.urlopen(link)

#Loading data
temp_list = []
for line in f:
    entries = 0
    data_splitted = line.split()
    if len(data_splitted) == 2:
            file_name = data_splitted[0]
    else:
        entries = 1+entries
        if data_splitted[-1] == ']':
            temp_list.extend([ast.literal_eval(i) for i in data_splitted[:-1]])
        else:
            temp_list.extend([ast.literal_eval(i) for i in data_splitted])

#Reformatting data
dimension = 120
entries = len(temp_list)/dimension
data = np.array(temp_list)
interweaved = data.reshape(entries,dimension)
static =interweaved[:,:-80]
delta =interweaved[:,40:-40]
delta_delta =interweaved[:,80:]
plot_interweaved = data.reshape(entries*3,dimension/3)
print static.shape
print delta.shape
print delta_delta.shape
make_plot_store_data(file_name,plot_interweaved,static,delta,delta_delta,True,False,False)

运行此代码会创建两个图。首先是使用librosa绘制的版本,另一个使用colormap cm.jet来提取每个像素值。

问题是,即使正在执行的内容相同,两个情节都不相同。 librosa.display.specshow pcolormesh使用my_list = ["a","b","c","d"] 制作情节,因此不应该偏见任何东西。

但我看到的情节是:

以下是使用librosa创建的实际绘图:

enter image description here

重新创作的情节:

enter image description here

有什么问题?

1 个答案:

答案 0 :(得分:2)

首先,

plt.imshow(static.T, cmap=plt.cm.jet, aspect="auto", origin="lower")

为您提供所需的绘图,因此色彩映射没有任何问题。

其次,不要使用一些你不了解的规范化。我只能在这里重复my answer to your previous question,它会告诉您规范化数据的最小值和最大值。

import matplotlib.colors
cmap = plt.cm.jet
norm = matplotlib.colors.Normalize(vmin=static.min(),vmax=static.max())
newdata = cmap(norm(static.T))
plt.imshow(newdata, aspect="auto", origin="lower")