Проблемы с графами при создании интерактивных графиков с использованием matplotlib

#python #numpy #matplotlib #graph

#python #numpy #matplotlib #График

Вопрос:

Я пытался создать интерактивный график с помощью слайдера. Но когда я перемещаю ползунок, высота пика графика перестала становиться 1. Согласно Desmos, график должен быть таким: график функции

Без изменения высоты пика изменяется только значение x для пика при изменении значения внутри косинуса. Есть ли какие-либо проблемы при кодировании графика? Поскольку функция довольно сложная.

 import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons

fig, ax = plt.subplots()
ax.set_ylabel("L")
ax.set_xlabel("Energy in keV")
ax.set_title("Output graph for change of spectrum with the detection angle")
plt.subplots_adjust(left=0.25, bottom=0.25)
t = np.arange(10, 20.0, 0.01)
a0 = 0
s = 0.01/(0.01 2*np.power(((1/((1/t)-((1-np.cos(a0)))/512))-17),2))
l, = plt.plot(t, s, lw=2)
ax.margins(x=0)
axcolor = 'lightgoldenrodyellow'
axamp = plt.axes([0.25, 0.09, 0.65, 0.03], facecolor=axcolor)

samp = Slider(axamp, 'Detection angle',0.0, 180.0,valstep=5, valinit=a0)

def update(val):
    amp = samp.val
    l.set_ydata(0.1/(0.1 2*np.power(((1/((1/t)-(1-np.cos(amp))/512))-17),2)))
    fig.canvas.draw_idle()

samp.on_changed(update)

resetax = plt.axes([0.8, 0.025, 0.1, 0.04])
button = Button(resetax, 'Reset', color=axcolor, hovercolor='0.975')


def reset(event):
    samp.reset()
button.on_clicked(reset)

rax = plt.axes([0.025, 0.5, 0.13, 0.15], facecolor=axcolor)
radio = RadioButtons(rax, ('red', 'blue', 'green'), active=0)


def colorfunc(label):
    l.set_color(label)
    fig.canvas.draw_idle()
radio.on_clicked(colorfunc)

colorfunc(radio.value_selected)

plt.show()

 

Я новичок в программировании на Python, поэтому простите меня, если есть какие-либо ошибки.
Спасибо.

Ответ №1:

Изменить np.cos(amp) на np.cos(np.deg2rad(amp)) (это связано с тем, что np.cos ожидает входные углы в радианах)

Кроме того, я думаю, у вас должно быть after (1/t) в формуле, которую вы вычисляете на основе изображения, на которое вы ссылались в сообщении.

 import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons

fig, ax = plt.subplots()
ax.set_ylabel("L")
ax.set_xlabel("Energy in keV")
ax.set_title("Output graph for change of spectrum with the detection angle")
plt.subplots_adjust(left=0.25, bottom=0.25)
t = np.arange(10, 20.0, 0.01)
a0 = 0
# 0 radians or 0 degress doesn't matter so you can neglect conversion here
s = 0.01 / (0.01   2 * np.power(((1 / ((1 / t)   ((1 - np.cos(a0))) / 512)) - 17), 2))
l, = plt.plot(t, s, lw=2)
ax.margins(x=0)
axcolor = 'lightgoldenrodyellow'
axamp = plt.axes([0.25, 0.09, 0.65, 0.03], facecolor=axcolor)

samp = Slider(axamp, 'Detection angle', 0.0, 180.0, valstep=5, valinit=a0)


def update(val):
    amp = samp.val
    l.set_ydata(0.1 / (0.1   2 * np.power(((1 / ((1 / t)   (1 - np.cos(np.deg2rad(amp))) / 512)) - 17), 2)))
    fig.canvas.draw_idle()


samp.on_changed(update)

resetax = plt.axes([0.8, 0.025, 0.1, 0.04])
button = Button(resetax, 'Reset', color=axcolor, hovercolor='0.975')


def reset(event):
    samp.reset()


button.on_clicked(reset)

rax = plt.axes([0.025, 0.5, 0.13, 0.15], facecolor=axcolor)
radio = RadioButtons(rax, ('red', 'blue', 'green'), active=0)


def colorfunc(label):
    l.set_color(label)
    fig.canvas.draw_idle()


radio.on_clicked(colorfunc)

colorfunc(radio.value_selected)

plt.show()
 

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

1. Проблема по-прежнему сохраняется.

2. Каково ожидаемое поведение? Сигнал должен просто перемещаться вдоль оси x, верно?

3. Или вы хотите, чтобы высота пика изменялась, сохраняя постоянную позицию?

4. Извините за знак плюс минус, но это не слишком сильно повлияло на поведение, только на x-направление перемещения пика. Для меня после перемещения ползунка пик исчезает, а график представляет собой просто горизонтальную линию, близкую к нулю. Со случайными пиками, но не на высоте 1.

5. Это странно. Я думаю, что у меня правильное поведение при перемещении пика между x = 17 и x = 18. Попробуйте запустить мой код