【问题标题】:Not able to recreate plot as numpy array? [duplicate]无法将绘图重新创建为 numpy 数组? [复制]
【发布时间】:2017-05-18 20:54:05
【问题描述】:

我目前正在尝试创建一个类似于情节的 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 绘制的版本,另一个是使用颜色图 cm.jet 提取每个像素值的版本。

问题是即使执行的内容相同,两个情节也不相同。 librosa.display.specshowmake 使用pcolormesh 来制作情节,所以它不应该有任何偏见。

但我看到的情节是:

这是使用 librosa 创建的实际情节:

以及重新创建的情节:

怎么了?

【问题讨论】:

    标签: python numpy matplotlib plot


    【解决方案1】:

    首先,

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

    【讨论】:

      猜你喜欢
      • 2020-12-21
      • 2016-05-22
      • 1970-01-01
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-13
      • 1970-01-01
      相关资源
      最近更新 更多