暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

关于Python可视化Dash工具-dash核心组件和html组件

追梦IT人 2021-04-04
1583

关于Python可视化Dash工具,不能不提dash核心组件和html组件,用户可以使用Python结构和dash-html-components库来构建布局,而不是编写HTML或使用HTML模板引擎 。dash-html-components库和标准的html还是有点区别的。以下内容来自dash官网的介绍:

如果使用的是HTML组件,那么还可以访问诸如style、class和id之类的属性。

HTML元素和破折号类基本相同,但有几个关键区别:

  • style属性是字典

  • 样式字典中的属性是大小写的

  • 类键被重命名为className

  • 以像素为单位的样式属性可以仅作为数字提供,而不使用px单位

下面的例子是html组件的一些常规用法,包括style,classname,id的使用,暂未使用css文件。

import dashimport dash_core_components as dccimport dash_html_components as htmlfrom dash.dependencies import Input, Output, State, MATCH, ALLimport plotly.express as pximport random as rnapp = dash.Dash(__name__, suppress_callback_exceptions=True)# 一个网站的CSS都是一个单独的样式表的,在dash中任何放在assets中的CSS外部样式都会被自动加载# 创建一个style.css文件来设置背景颜色# body {#     background-color:green;# }app.layout = html.Div([    html.H1('Hello Dash'),    html.Div([        html.P('Dash P 测试1'),        html.P("Dash P 测试2"),        html.Div('Div with style 测试', style={'color': 'blue', 'fontSize': 14}),        html.P('Dash P 测试2 with style 测试', className='my-class', id='my-p-element'),        html.Img(src="assets/aaaa.jpg",style={"height":"200px"})    ], style={'marginBottom': 50, 'marginTop': 25})

])

# dash_html_components支持className,id,也支持style

if __name__ == '__main__':    app.run_server(debug=True)

访问127.0.0.1:8050即可

HTML的CSS文件默认是放在asset目录下的,无需指定路径。在这里定义了body,li和li:hover(锚定)的css样式。

/* body background */body {    background-color:white;    width:100%;    height:100%;    margin:0px;}/* li  */li {    color:blue;    font-size: 2rem;    font-weight: bold;    transition: all 0.2s ease-in-out;} li:hover {    transform: scale(1.15);} 

下面的例子很简单,通过html.UI,html.li遍历python变量生成列表值,鼠标指向列表值,列表值会增大。

sports_lists = [    "" + "足球",    "" + "篮球",    "" + "排球",    "" + "羽毛球",    "" + "乒乓球",    "" + "网球",]# 应用列表解析式动态生成HTML网页app.layout = html.Ul([html.Li(sport) for sport in sports_lists])

接下来要定义一个类似大屏风格展示的CSS,要确保该展示能够随着屏幕分辨率的变化而保持相对稳定,首先定义了个顶层的container,接下来是logo区域,顶部样式区域,中间区域,和底部区域。以不同颜色区隔开来。

#container {    width: 100vw;    height: 100vh;}/*顶部logo条带样式*/#logo {    width:100%;    height:10%;    background-image:url("npp.png");    background-repeat:no-repeat;    background-size:100% 100%;}/*顶部样式*/#header {    width:100%;    height:13%;    background-color:darkorchid;} /*中间部分面板样式*/ #main {     width:100%;     height:70%;     background-color:hotpink; }  /*底部面板样式*/#footer {    width:100%;    height:7%;    background-color:rgb(126, 186, 114);}

在dash中也很简单,主要通过id来进行标识。

app.layout=html.Div([html.Div('Div logo', id='logo'),                     html.Div('Div header', id='header'),                     html.Div('Div main',id='main'),                     html.Div('Div footer', id='footer')]                    ,id='container')

最后的展示效果如下:

大屏的部分再进一步细化,主要是细化中间部分(main),中间部分首先分为左中右,左边再区分成上中下区域,同样需要确保比例是固定的。

/*左侧部分面板样式*/#mleft {    width:20%;    height:100%;    background-color:black;    float:left;} /*中间部分面板样式*/#mmap {    width:60%;    height:100%;    float:left;} /*右侧部分面板样式*/#mright {    width:20%;    height:100%;    background-color:rgb(186, 218, 199);    float:left;} /*左侧上面部分分面板样式*/#left-top {    width:100%;    height:33%;    background-color:lightblue;} /*左侧中间部分面板样式*/#left-middle {    width:100%;    height:33%;    background-color:greenyellow;} /*左侧右侧部分面板样式*/#left-right {    width:100%;    height:33%;    background-color:rgb(179, 173, 230);    float:left;}

对原来的dash再次修改,不断增加层级。

app.layout=html.Div([html.Div('Div logo', id='logo'),                     html.Div('Div header', id='header'),                     html.Div([                         html.Div([                             html.Div('Div left-top', id='left-top'),                             html.Div('Div left-middle', id='left-middle'),                             html.Div('Div left-bottom', id='left-bottom'),                         ], id='mleft'),                         html.Div('Div map', id='mmap'),                         html.Div('Div right', id='mright')]                         ,id='main'),                     html.Div('Div footer', id='footer')]                    ,id='container')

展示的效果如下,通过缩小浏览器窗口,显示比例是固定的。

接下来再加入html组件和核心组件,测试table组件、tr组件、td组件和下拉列表组件

app.layout=html.Div([html.Div('Div logo', id='logo'),                     html.Div('Div header', id='header'),                     # html.Div('Div main',id='main'),                     html.Div([                         #html.Div('Div left', id='mleft'),                         html.Div([                             html.Div('Div left-top', id='left-top'),                             html.Div('Div left-middle', id='left-middle'),                             html.Div('Div left-bottom', id='left-bottom'),                         ], id='mleft'),                         html.Div([                             html.Table([                                 html.Tr([                                     html.Td('第一行第一列'),                                     html.Td('第一行第二列'),                                     html.Td('第一行第三列')                                 ]),                                 html.Tr([                                     html.Td('第二行第一列'),                                     html.Td('第二行第二列'),                                     html.Td('第二行第三列')                                 ]),                                 html.Tr([                                     html.Td('第三行第一列'),                                     html.Td('第三行第二列'),                                     html.Td('第三行第三列')                                 ])]                             ),                             html.H1('下拉选择'),                             html.Br(),                             dcc.Dropdown(options=[                                 {'label':'选项一','value':1},{'label':'选项二','value':2},{'label':'选项三','value':3}]),                         ], id='mmap'),                         html.Div('Div right', id='mright')                     ],id='main'),                     html.Div('Div footer', id='footer')]                    ,id='container')

展示效果如下

说实在的,UI对一个程序员来说真是个考验,缺乏足够的审美眼光,只能确保系统正常使用,当然对我而言足够了。

后续会在这个大框架基础继续完善,进一步开启回调的学习,并和图表进行结合。

文章转载自追梦IT人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论