【问题标题】:How to remove legend from Matplotlib specgram?如何从 Matplotlib 谱图中删除图例?
【发布时间】:2020-04-08 16:42:12
【问题描述】:

我正在尝试删除频谱图的图例(我正在尝试获取 244x244 像素的图像)

我尝试过Remove the legend on a matplotlib figure,但它的工作方式非常奇怪 - 我得到了结果并且异常!看 - 图片 -

(我正在使用谷歌 colab)

这是我正在使用的代码

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import moviepy.editor as mpy

import youtube_dl
## downloading the video
ydl_opts = {
    'format': 'bestaudio/best',
    'postprocessors': [{
        'key': 'FFmpegExtractAudio',
        'preferredcodec': 'wav',
        'preferredquality': '192',
    }],
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
    ydl.download(['https://www.youtube.com/watch?v=5pIpVK3Gecg'])

## selecting the audio clip from 17oth second to 180th second and saving it in talk.wav
from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip
ffmpeg_extract_subclip("Tyler, The Creator - 'IGOR,' Odd Future and Scoring a" 
                       "Number 1 Album _ Apple Music-5pIpVK3Gecg.wav", 170, 
                       180, targetname="talk.wav")


talk = mpy.AudioFileClip('talk.wav')
# switching axis off
plt.axis('off')

sample_rate = talk.fps
NFFT = sample_rate /25
audio_data = talk.to_soundarray()
#trying to get a 244 x 244 pixel image 
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(2.44, 2.44), dpi=100.)

ax.axis('off')

spectrum, freqs, time, im = ax.specgram(audio_data.mean(axis=1), NFFT=NFFT, pad_to=4096, 
                                        Fs=sample_rate, noverlap=512, mode='magnitude', )


########## the problem lies here ##########
ax.get_legend.remove()

##trying to save stuff to drive but this doesnt run because of the exception
fig.colorbar(im)
fig.savefig('specto.png')

import os
print( os.getcwd() )
print( os.listdir('specto.png') )

from google.colab import files
files.download( "specto.png" ) 


有没有办法解决这个问题?

【问题讨论】:

    标签: python matplotlib google-colaboratory spectrogram


    【解决方案1】:

    ax.get_legend 引用函数对象本身,ax.get_legend()(注意括号)调用函数并返回一个matplotlib.legend.Legend 实例或None。语法应该是

    ax.get_legend().remove()
    

    但是,如果没有将图例添加到情节中,这将引发

    AttributeErrorNoneType 对象没有属性remove

    所以最好用tryexcept 子句来保护它,除非你提前知道会有一个传说。


    编辑

    根据评论,您将matplot.pyplot.colorbar()matplotlib.pyplot.legend() 混淆了,因此为什么在行前引发异常时它“似乎有效”

    fig.colorbar(img)
    

    它根本不会绘制颜色条,因为它没有到达那条线。如果您不想要颜色条,请删除线条

    ax.get_legend().remove()
    
    fig.colorbar(im)
    

    你会得到一个没有颜色条的频谱图。

    【讨论】:

    • 我添加了括号,我得到了正确结果的 AttributeError。频谱图似乎总是有一个图例 - imgur.com/a/U3tfGlL 但是当我这样做时 ax.get_legend().remove() ,它似乎有些工作但有一个错误 - imgur.com/a/Ss4NFki 有没有办法让它在没有错误的情况下工作?
    猜你喜欢
    • 2017-02-28
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    相关资源
    最近更新 更多