概述
最近在做数据分析的时候,发现 ipywidgets库用于数据分析可视化真的是非常的nice。下图展示多个下拉框在 jupyter上面的 的显示效果
我在网上找了很多教程大多数都是实现一个下拉菜单的样式,多个下拉菜单样式的具体使用例子很少,这很不利于初学者学习使用。所以我自己也是研究了好久才写出了一个成功可用的例子。
代码实现
我这个下拉框实现的功能是更具选择的内容找到所在的具体班级的Excel文件打开并画出折线图展示数据。其实利用下拉菜单只是实现了对文件所在路径进行字符串拼接的操作,把拼接好的字符串传递给一个读取文件的函数然后进行相关操作。
#需要导入的包
# 文档 (https://flowercloud.net/aff.php?aff=11050)
from ipywidgets import interact
import ipywidgets as widgets
from IPython.display import display
classlist=['1班','2班','3班']
a=widgets.Dropdown(
options=['','2015年','2016学年','2017学年'],
description='选择年份:',
)
b=widgets.Dropdown(
options=['','大一','大二','大三','大四'],
description='选择年级:',
)
c=widgets.Dropdown(
options=classlist,#这里是班级名称的列表由于数据太多我上面用一个简单的 列表代替
description='选择班级:',
)
d=widgets.Dropdown(
options=[('请选择体测项目',0),('身高体重分数',1),('肺活量体重分数',2),('50米分数',3),('800米或1000米分数',4),
('坐位体前屈分数',5),('立定跳远分数',6),('引体向上或一分钟仰卧起坐',7),('测试总分',8)],
description='选择项目:',
)
p="\\"
pa=''
pat=''
classname=''#班级名称
output_class = widgets.Output()
def choiceY(x):
# print(x.new)
global p
p =p+ x.new #拼接路径
#print(p)
return p
def choiceG(g):
global p
global pa
global classlist
pa = p + '\\'+g.new #拼接路径
#print(pa)
return pa
def choiceC(y):
global p
global pa
global pat
global classname
classname =y.new
pat =pa +'\\'+ y.new+'.xlsx' #拼接路径
#print(pat)
return pat,classname
def choiceO(z):
#print(z.new)
name = ['无','身高体重分数','肺活量体重分数','50米分数']
global pat
global classname
output_class.clear_output()# 每次迭代中清除先前的选择,并在with块中捕获数据帧的输出。
with output_class:
path= '2015-2018学年'+pat
a =getdata(path)
className=classname
display(chartpot(a[0],a[z.new],name[z.new],className))
a.observe(choiceY,names='value')
b.observe(choiceG,names='value')
c.observe(choiceC,names='value')
d.observe(choiceO,names='value')
ui = widgets.HBox([a, b, c,d])
display(ui)
display(output_class)#在一个新的单元格中显示输出:
其中 ==getdata(path)==是我自己封装的对读取文件后对数据的处理函数,只需传入文件路径就可以,返回值是一些处理好的数据。
chartpot(a[0],a[z.new],name[z.new],className) 是我自己封装的画折线图的函数,需要传入四个参数1. X轴刻度的文本(是一个列表),2.Y轴数据(也是一个列表)3.折线图标题名称(字符串)4.折线的label名称(字符串)
根据我自己的理解来讲解一下
widgets.Dropdown方法创建一个下拉菜单的实例 相关参数的配置我就不介绍了。
display(ui) 用这个方法把 四个下拉框显示出来
最难的地方是output_class = widgets.Output()
output_class.clear_output()
with output_class: 后面必须使用display()
我之前每次更换第四个下拉框的时候 每次画的图都会接着上面一个图的姓名画出来,就会导致你切换图表的时候它会不停的往下面画图。
我想要的效果是切换图表的时候这个界面只出现一张图,而不是很多图。
ui = widgets.HBox([a, b, c,d]) 这个方法把四个下拉菜单放在同一行
用 observe 方法来绑定函数 里面有两个参数。一个是绑定函数的名称,另外一个是你绑定那个函数需要接收的参数的类型 比如 choiceO(z)
z 接收的就是names='value’时候传进来的参数。你们可以把names=‘value’ 去掉然后在choiceO(z)函数里面 print(z)打印出来看一下你们就能理解。具体是什么意思请到官网查看。
实现的效果
总结
我现在是把效果实现了其中关于 widgets.Output()方法的用法还需要再加深理解。我相信有很多小伙伴在学习的时候因为找不到学习资源而懊恼。所以我把我的经验和方法分享出来。上面的内容都是根据我自己的理解来讲解的。如果有说的不对的地方请大家留言或评论,我会加以改正,谢谢大家。