Matplotlib не показывает чтение, если метки тиков изменены

1

Я ожидаю, что наведу указатель мыши на график и получу чистые данные с правой стороны панели навигации в автоматически сгенерированном окне графика.

В моем случае (см. Код внизу), однако, если я поверну метки тика оси Y в децибелы, показания y в навигационной панели (нижний правый угол) исчезнут, например, так:

Изображение 174551

#PROBLEM: Если вы закомментируете #PROBLEM кода #PROBLEM в приведенном ниже коде, тогда будет видно y-чтение в правом нижнем углу, например:

Изображение 174551

Код, который я использовал для упаковки виджетов:

from os.path import abspath, dirname, join
import tkinter as tk

import numpy as np
import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk as NavigationToolbar
from scipy.io import wavfile

root = tk.Tk()
mainframe = tk.Frame(root)
mainframe.pack()

frame = tk.Frame(mainframe)
frame.pack()
figFrame = tk.Frame(frame)
toolFrame = tk.Frame(frame)
figFrame.pack(side='top', fill='both', expand=True)
toolFrame.pack(side='top', fill='both', expand=True)

# Place the figure
fig = plt.Figure()
figWidget = FigureCanvasTkAgg(fig, master=figFrame)
track = figWidget.get_tk_widget()
track.pack(side='top', fill='both', expand=True)

# Place the toolbar
toolbar = NavigationToolbar(figWidget, toolFrame)
toolbar.pack(side='top', fill='both', expand=True)

# Get data
SR, signal = wavfile.read(join(abspath(dirname(__file__)), 'y.wav'))

# Plot the signal read from wav file
ax = fig.add_subplot(111)
ax.set_title('Waveform and Spectrogram of a wav file')
ax.plot(signal)
ax.set_xlabel('Sample')
ax.set_ylabel('Amplitude')

# PROBLEM: Truncated y-readings in Toolbar
ax.set_ylabel('Amplitude (dB)')
ticks = ax.get_yticks()
t1 = 20*np.log10(-ticks[(ticks < 0)])
t2 = 20*np.log10(ticks[(ticks > 0)])
t1 = [float('{:.1f}'.format(i)) for i in t1]
t2 = [float('{:.1f}'.format(i)) for i in t2]
ticks = np.concatenate((t1, [-np.inf], t2))
ax.set_yticklabels(ticks)
# PROBLEM: END


plt.show()

root.mainloop()

Интересно, где я ошибся? Я предполагаю, что когда галочки взломаны (по-моему), тогда вообще не будет чтения... Если так, то это жаль, потому что я изменил только галочки, а не данные.

Теги:
matplotlib
tkinter

1 ответ

3
Лучший ответ

Ясно, что никакие полезные координаты y могут быть показаны, когда вы устанавливаете метки вручную; может быть, это станет яснее, если учесть, что вы могли бы пометить сюжет "Apple", "Banana", "Cherry" - в таком случае, какой будет координата, когда мышь находится на полпути между "Banana" и "Cherry"?

Однако вы можете использовать FuncFormatter для установки формата меток.

import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter
import numpy as np

signal = np.sin(np.linspace(0,12,300))*.7


fig, ax = plt.subplots()
ax.set_title('Waveform and Spectrogram of a wav file')
ax.plot(signal)
ax.set_xlabel('Sample')
ax.set_ylabel('Amplitude (dB)')

def fmt(x,pos=None):
    if x==0:
        return "-inf"
    else:
        return '{:.1f}'.format(20*np.log10(np.sign(x)*x))

ax.yaxis.set_major_formatter(FuncFormatter(fmt))


plt.show()

Изображение 174551

  • 0
    Большое спасибо! Так как мне пришло в голову после публикации, есть обратный вызов для чтения данных. В коде Formatter есть только одна проблема: исправление: если x! = 0: s = 20 * np.log10 (np.sign (x) * x). Я исправил это на месте и приму ваш ответ.
  • 0
    Я реализовал точный код, который у вас есть в вопросе. Если вы хотите попросить что-то другое, вы можете сделать это. Я перенес вашу правку.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню