Python 如何使用滑块同时更新更多的线图?

Python 如何使用滑块同时更新更多的线图?,python,matplotlib,slider,Python,Matplotlib,Slider,这是我的第一个与代码相关的问题,所以请耐心听我说,我是一个完全的初学者!我已经开发了一个使用三个库(tkiner、pandas和matplotlib)的小型桌面应用程序,该应用程序从csv绘制多个图形。其中一个图形使用滑块动态更新,该滑块可更改x值乘以的因子 我的问题是:如何同时更改图例以及x轴的限制 我试图访问ax2的标签并为其分配更新的值,但我找不到一种方法。是否有类似于l.set\u label(label=name+“Nspt x f1={}.format(f1)) 我附加了一个小代码部

这是我的第一个与代码相关的问题,所以请耐心听我说,我是一个完全的初学者!我已经开发了一个使用三个库(tkiner、pandas和matplotlib)的小型桌面应用程序,该应用程序从csv绘制多个图形。其中一个图形使用滑块动态更新,该滑块可更改x值乘以的因子

我的问题是:如何同时更改图例以及x轴的限制

我试图访问ax2的标签并为其分配更新的值,但我找不到一种方法。是否有类似于
l.set\u label(label=name+“Nspt x f1={}.format(f1))

我附加了一个小代码部分来说明问题。还有一个情节的图像。感谢愿意花时间帮助我的人

initial_f1=5

axcolor ='darkgray'
axf1 = plt.axes([0.6,0.01, 0.3, 0.01], facecolor=axcolor)
sf1=Slider(axf1,"f1",4.0,6.5,valinit=initial_f1,valstep=0.5)

for name, group in bh_groups:
    ax1.plot(group["Nspt"],group["ztest"],marker="X",linestyle="",ms=8, label=name)
    ax2.plot(group["cu"],group["ztest"],marker="o",linestyle="",ms=8,label=name +" Triaxial tests")
    l,=ax2.plot(group["Nspt"]*initial_f1,group["ztest"],marker="X",linestyle="",ms=8,label=name +" Nspt x f1={}".format(initial_f1))
 

    def update(val):

        f1 = sf1.val
        l.set_xdata(f1*group["Nspt"])                
        fig1.canvas.draw_idle()
        
    sf1.on_changed(update)



ax1.set_xlabel('Nspt',fontweight="bold")    
ax1.xaxis.set_label_position('top')
ax1.xaxis.tick_top()
ax1.set_ylabel("z [mOD]")

ax2.set_xlabel('Undrained Shear Strength, su [kPa]',fontweight="bold")    
ax2.xaxis.set_label_position('top')
ax2.xaxis.tick_top()
ax2.set_ylabel("z [mOD]")
输出:

编辑: 我也设法更新了图例,现在如果我想让滑块同时作用于更多的线条,该怎么办?这些线由一个函数描述,并取决于同一个变量f1。我还没找到解决办法,知道吗

fig1, (ax1,ax2) = plt.subplots(nrows=1,ncols=2)
fig1.canvas.set_window_title('Data by borehole')

initial_f1=5

axcolor ='darkgray'
axf1 = plt.axes([0.6,0.01, 0.3, 0.01], facecolor=axcolor)
sf1=Slider(axf1,"f1",4.0,6.5,valinit=initial_f1,valstep=0.5)


   
for name, group in bh_groups:
    ax1.plot(group["Nspt"],group["ztest"],marker="X",linestyle="",ms=8, label=name)
    ax2.plot(group["cu"],group["ztest"],marker="o",linestyle="",ms=8,label=name +" Triaxial tests")
    
    l,=ax2.plot(group["Nspt"]*initial_f1,group["ztest"],marker="X",linestyle="",ms=8,label=name +" Nspt x f1={}".format(initial_f1))
    




def update(val):
    f1 = val
   
    l.set_xdata(f1*group["Nspt"])  
            
    l.set_label(name +" Nspt x f1={}".format(f1)) 
    ax2.legend(loc="best")
        
sf1.on_changed(update)
fig1.canvas.draw_idle()
    

ax1.set_xlabel('Nspt',fontweight="bold")    
ax1.xaxis.set_label_position('top')
ax1.xaxis.tick_top()
ax1.set_ylabel("z [mOD]")

ax2.set_xlabel('Undrained Shear Strength, su [kPa]',fontweight="bold")    
ax2.xaxis.set_label_position('top')
ax2.xaxis.tick_top()
ax2.set_ylabel("z [mOD]")

ax1.legend(loc="best") 

plt.tight_layout()

 

plt.show()

这里是一个简单的示例,其中一个滑块控制:

  • 两行
  • 两个标签+图例条目
  • x轴的极限
这两个函数不是很有创意:
y1=sin(alpha*x)
y2=cos(alpha*x)
x轴上的限制为:
[0,3*pi*alpha]

将numpy导入为np
将matplotlib.pyplot作为plt导入
从matplotlib.widgets导入滑块
x=np.linspace(0,np.pi*21000)
y1=np.sin(1*x)
y2=np.cos(1*x)
图,ax=plt.子批次()
图子批次调整(底部=0.25)
ax.set_xlim(0,2*np.pi)
h1=ax.plot(x,y1,label='dummy')[0]
h2=ax.plot(x,y2,label='dummy')[0]
ax.图例(loc='右上方')
滑块α=滑块(plt.轴([0.2,0.1,0.6,0.05]),“α”,
valmin=1,valmax=2,valinit=1,valstep=0.01)
def更新(val):
#更新行
x=np.linspace(0,np.pi*3*val,1000)
y1=np.sin(x*val)
y2=np.cos(x*val)
h1.设置_数据(x,y1)
h2.设置_数据(x,y2)
#更新标签+图例()
h1.set_标签(“y=sin(x*{.3})”。格式(float(val)))
h2.set_标签(“y=cos(x*{.3})”。格式(float(val)))
ax.图例(loc='右上方')
#更新x限制
ax.set_xlim(0,np.pi*3*val)
滑块上的α已更改(更新)

这能解决您的问题吗?