matplotlib — loglog дает мне неработающие графики

#python #matplotlib

#python #matplotlib

Вопрос:

Я встраиваю свои графики в программу GTK2. Как вы можете видеть из моих двух рисунков ниже, если я построю свои данные линейным способом, график будет в порядке, но использование loglog метода дает мне непригодный для использования график:

Линейный образец
Журнал -пример журнала

Для создания обоих этих графиков использовались одни и те же данные. Ниже приведен код:

 win2 = gtk.Window()
win2.set_default_size(400,300)
win2.set_title("Embedding in GTK")
fig2 = Figure(figsize=(5, 8), dpi=100)
freqStart = float(txtFreqStart.get_text())
freqEnd = float(txtFreqEnd.get_text())

vbox2 = gtk.VBox()
win2.add(vbox2)
ax2 = fig2.add_subplot(221)
ax3 = fig2.add_subplot(222)
ax4 = fig2.add_subplot(223)
ax5 = fig2.add_subplot(224)

ya = list(subData[ls / 0.005:le / 0.005])

for i in xrange(0, len(ya)):
    if ya[i] < 0:
        ya[i] = 0

yb = list(subData[ls / 0.005:le / 0.005])

for i in xrange(0, len(yb)):
    if yb[i] > 0:
        yb[i] = 0

Ya = fft(ya)
Yb = fft(yb)

ax2.plot(list(frange(ls, le, 0.005)), ya)
ax3.plot(list(frange(ls, le, 0.005)), yb)

if radLoglog.get_active():
    print ax4.loglog(list(frange(freqStart, freqEnd, 1)), Ya[freqStart:freqEnd])[0].get_xdata()
    ax5.loglog(list(frange(freqStart, freqEnd, 1)), Yb[freqStart:freqEnd])
else:
    print ax4.plot(list(frange(freqStart, freqEnd, 1)), Ya[freqStart:freqEnd])[0].get_xdata()
    ax5.plot(list(frange(freqStart, freqEnd, 1)), Yb[freqStart:freqEnd])

canvas2 = FigureCanvas(fig2)
canvas2.draw()
vbox2.pack_end(canvas2)

toolbar2 = NavigationToolbar(canvas2, win2)
vbox2.pack_start(toolbar2, False, False)

win2.show_all()
  

Комментарии:

1. у вас есть отрицательные и нулевые значения. log(x) когда x <= 0 не определено. для меня графики выглядят правильно. попробуйте замаскировать нули

2. просто совет: код GUI не имеет значения. было бы более полезно включить код, который генерирует (поддельные) данные для воспроизведения проблемы.

3. Спасибо, я понял. Я поскользнулся и забыл взять абсолютное значение БПФ

Ответ №1:

Как говорит @PaulH в комментариях, это правильное поведение.

log отрицательное число не определено, что numpy решается путем возврата NaN ( np.isnan(np.log(-1)) ) . matplotlib маскирует NaN при построении графика.