Python 使用matplotlib生成交互式绘图时的图形问题

Python 使用matplotlib生成交互式绘图时的图形问题,python,numpy,matplotlib,graph,Python,Numpy,Matplotlib,Graph,我试图制作一个带有滑块的交互式绘图。 但当我移动滑块时,图形的峰值高度不再变为1。 根据Desmos,图表应如下所示: 在峰高不变的情况下,当余弦内的值发生变化时,峰值的x值仅发生变化。 图表的编码有什么问题吗?因为功能比较复杂 import numpy as np import matplotlib.pyplot as plt from matplotlib.widgets import Slider, Button, RadioButtons fig, ax = plt.subplots

我试图制作一个带有滑块的交互式绘图。 但当我移动滑块时,图形的峰值高度不再变为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编程很陌生,所以如果有任何错误,请原谅我。 谢谢。

np.cos(amp)
更改为
np.cos(np.deg2rad(amp))
(这是因为,np.cos需要以弧度为单位的输入角度)

另外,我认为你应该在公式中的
+
后面加一个
(1/t)
,这个公式是根据你在文章中链接到的图像计算的

将numpy导入为np
将matplotlib.pyplot作为plt导入
从matplotlib.widgets导入滑块、按钮、单选按钮
图,ax=plt.子批次()
ax.set_ylabel(“L”)
ax.set_xlabel(“能量单位为千电子伏”)
ax.设置标题(“光谱随检测角度变化的输出图”)
plt.子批次调整(左=0.25,下=0.25)
t=np.arange(10,20.0,0.01)
a0=0
#0弧度或0度无关紧要,因此您可以忽略此处的转换
s=0.01/(0.01+2*np.功率((1/(1/t)+(1-np.cos(a0))/512))-17),2))
l、 =plt.绘图(t,s,lw=2)
最大利润率(x=0)
axcolor='淡黄花'
axamp=plt.轴([0.25,0.09,0.65,0.03],面色=axcolor)
samp=滑块(axamp,‘检测角度’,0.0、180.0、valstep=5、valinit=a0)
def更新(val):
amp=samp.val
l、 设置y数据(0.1/(0.1+2*np.功率((1/(1/t)+(1-np.cos(np.deg2rad(amp)))/512))-17,2)))
图canvas.draw_idle()
更改上的样本(更新)
resetax=plt.轴([0.8,0.025,0.1,0.04])
按钮=按钮(resetax,'Reset',color=axcolor,hovercolor='0.975')
def重置(事件):
samp.reset()
按钮。单击时(重置)
rax=plt.轴([0.025,0.5,0.13,0.15],facecolor=axcolor)
单选=单选按钮(rax,(“红色”、“蓝色”、“绿色”),活动=0)
def colorfunc(标签):
l、 设置颜色(标签)
图canvas.draw_idle()
收音机。单击时(colorfunc)
colorfunc(单选值)
plt.show()
np.cos(amp)
更改为
np.cos(np.deg2rad(amp))
(这是因为,np.cos需要以弧度为单位的输入角度)

另外,我认为你应该在公式中的
+
后面加一个
(1/t)
,这个公式是根据你在文章中链接到的图像计算的

将numpy导入为np
将matplotlib.pyplot作为plt导入
从matplotlib.widgets导入滑块、按钮、单选按钮
图,ax=plt.子批次()
ax.set_ylabel(“L”)
ax.set_xlabel(“能量单位为千电子伏”)
ax.设置标题(“光谱随检测角度变化的输出图”)
plt.子批次调整(左=0.25,下=0.25)
t=np.arange(10,20.0,0.01)
a0=0
#0弧度或0度无关紧要,因此您可以忽略此处的转换
s=0.01/(0.01+2*np.功率((1/(1/t)+(1-np.cos(a0))/512))-17),2))
l、 =plt.绘图(t,s,lw=2)
最大利润率(x=0)
axcolor='淡黄花'
axamp=plt.轴([0.25,0.09,0.65,0.03],面色=axcolor)
samp=滑块(axamp,‘检测角度’,0.0、180.0、valstep=5、valinit=a0)
def更新(val):
amp=samp.val
l、 设置y数据(0.1/(0.1+2*np.功率((1/(1/t)+(1-np.cos(np.deg2rad(amp)))/512))-17,2)))
图canvas.draw_idle()
更改上的样本(更新)
resetax=plt.轴([0.8,0.025,0.1,0.04])
按钮=按钮(resetax,'Reset',color=axcolor,hovercolor='0.975')
def重置(事件):
samp.reset()
按钮。单击时(重置)
rax=plt.轴([0.025,0.5,0.13,0.15],facecolor=axcolor)
单选=单选按钮(rax,(“红色”、“蓝色”、“绿色”),活动=0)
def colorfunc(标签):
l、 设置颜色(标签)
图canvas.draw_idle()
收音机。单击时(colorfunc)
colorfunc(单选值)
plt.show()

问题仍然存在。预期的行为是什么?信号只是沿着x轴向右移动?或者你想让峰值高度变化以保持位置不变?对不起,正负号对行为没有太大影响,只是峰值移动的x方向。对我来说,移动滑块后,峰值消失,图形只是一条接近零的水平线。随机峰值出现,但不是在1的高度。这很奇怪。我认为我的行为是正确的,峰值在x=17和x=18之间移动。尝试运行我的代码问题仍然存在。预期的行为是什么?信号只是沿着x轴向右移动?或者你想让峰值高度变化以保持位置不变?对不起,正负号对行为没有太大影响,只是峰值移动的x方向。对我来说,移动滑块后,峰值消失,图形只是一条接近零的水平线。随机峰值出现,但不是在1的高度。这很奇怪。我认为我的行为是正确的,峰值在x=17和x=18之间移动。尝试运行我的代码