Dash应用程序由两部分组成。第一部分是布局(layout),描述应用程序的设计样式;第二部分描述了应用程序的交互性。
Dash为应用程序的所有可视化组件,提供了Python类,在dash_core_components库和dash_html_components库中,进行组件的维护。当然,也可以使用 JavaScript 和 React.js 构建自己的组件。
注: 在这篇文章中, Python中所有的代码通过app.py执行, 如果需要用Jupyter可以使用 JupyterDash

1.最基础的例子

  1. # -*- coding: utf-8 -*-
  2. # Run this app with `python app.py` and
  3. # visit http://127.0.0.1:8050/ in your web browser.
  4. import dash
  5. import dash_core_components as dcc
  6. import dash_html_components as html
  7. import plotly.express as px
  8. import pandas as pd
  9. external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
  10. app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
  11. # assume you have a "long-form" data frame
  12. # see https://plotly.com/python/px-arguments/ for more options
  13. df = pd.DataFrame({
  14. "Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"],
  15. "Amount": [4, 1, 2, 2, 4, 5],
  16. "City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"]
  17. })
  18. fig = px.bar(df, x="Fruit", y="Amount", color="City", barmode="group")
  19. app.layout = html.Div(children=[
  20. html.H1(children='Hello Dash'),
  21. html.Div(children='''
  22. Dash: A web application framework for Python.
  23. '''),
  24. dcc.Graph(
  25. id='example-graph',
  26. figure=fig
  27. )
  28. ])
  29. if __name__ == '__main__':
  30. app.run_server(debug=True)

image.png

  • 布局 **layout****html.Div****dcc.Graph** 这样的组件树组成;
  • Dash是 声明式 的,通过关键字参数描述组件。即Dash主要通过属性描述应用,如 styleclassNameid等;
  • children 属性是特殊的。通常来说,他总是第一个属性。 html.H1(children='Hello Dash')等同于 html.H1('Hello Dash')。里面也可以用字符串、列表、单个组件构成;
  • 应用程序中的字体与这里显示的字体看起来有些不同。这个应用程序使用一个定制的CSS样式表来修改元素的默认样式。你可以在css教程中学习更多,但现在你可以用: ```python external_stylesheets = [‘https://codepen.io/chriddyp/pen/bWLwgP.css‘]

app = dash.Dash(name, external_stylesheets=external_stylesheets)

  1. 来定义样式。<br />当你指定`app.run_server(debug=True)`的时候。Dash就变成了一个热重载的组件,默认修改代码,浏览器跟着重新渲染。
  2. <a name="L6zbd"></a>
  3. # 2.修改一些样式
  4. `dash_html_components`库包含每个HTML标记的组件类,以及所有HTML参数的关键字参数。<br />通过修改组件的内联样式来定制应用程序中的文本:
  5. ```python
  6. # -*- coding: utf-8 -*-
  7. # Run this app with `python app.py` and
  8. # visit http://127.0.0.1:8050/ in your web browser.
  9. import dash
  10. import dash_core_components as dcc
  11. import dash_html_components as html
  12. import plotly.express as px
  13. import pandas as pd
  14. external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
  15. app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
  16. colors = {
  17. 'background': '#111111',
  18. 'text': '#7FDBFF'
  19. }
  20. # assume you have a "long-form" data frame
  21. # see https://plotly.com/python/px-arguments/ for more options
  22. df = pd.DataFrame({
  23. "Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"],
  24. "Amount": [4, 1, 2, 2, 4, 5],
  25. "City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"]
  26. })
  27. fig = px.bar(df, x="Fruit", y="Amount", color="City", barmode="group")
  28. fig.update_layout(
  29. plot_bgcolor=colors['background'],
  30. paper_bgcolor=colors['background'],
  31. font_color=colors['text']
  32. )
  33. app.layout = html.Div(style={'backgroundColor': colors['background']}, children=[
  34. html.H1(
  35. children='Hello Dash',
  36. style={
  37. 'textAlign': 'center',
  38. 'color': colors['text']
  39. }
  40. ),
  41. html.Div(children='Dash: A web application framework for Python.', style={
  42. 'textAlign': 'center',
  43. 'color': colors['text']
  44. }),
  45. dcc.Graph(
  46. id='example-graph-2',
  47. figure=fig
  48. )
  49. ])
  50. if __name__ == '__main__':
  51. app.run_server(debug=True)

image.png
dash_html_componentsHTML 有几个重要的区别

  • HTML中的style属性是一个以分号分隔的字符串。在Dash中,是一个字典。
  • Dash中,style字典键是驼峰式的命名法,而在HTML中是-的形式如:textAligntext-align
  • HTMLclass 属性,对应Dash中的 className。
  • HTML 的子项是通过 children关键字参数指定的,按照惯例,这始终是第一个参数,经常被省略;
  • 除了上述外,其他所有HTML属性与标签,在Python中都有效。

    3.可重复使用组件

    通过用Python编写标记,我们可以创建复杂的可重用组件,如表,而无需切换上下文或语言。 ```python

    Run this app with python app.py and

    visit http://127.0.0.1:8050/ in your web browser.

import dash import dash_html_components as html import pandas as pd

df = pd.read_csv(‘https://gist.githubusercontent.com/chriddyp/c78bf172206ce24f77d6363a2d754b59/raw/c353e8ef842413cae56ae3920b8fd78468aa4cb2/usa-agricultural-exports-2011.csv‘)

def generate_table(dataframe, max_rows=10): return html.Table([ html.Thead( html.Tr([html.Th(col) for col in dataframe.columns]) ), html.Tbody([ html.Tr([ html.Td(dataframe.iloc[i][col]) for col in dataframe.columns ]) for i in range(min(len(dataframe), max_rows)) ]) ])

external_stylesheets = [‘https://codepen.io/chriddyp/pen/bWLwgP.css‘]

app = dash.Dash(name, external_stylesheets=external_stylesheets)

app.layout = html.Div(children=[ html.H4(children=’US Agriculture Exports (2011)’), generate_table(df) ])

if name == ‘main‘: app.run_server(debug=True)

  1. > ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2610909/1614319306936-b01f1732-ed51-4c56-9910-ae28a8b1c4ad.png#align=left&display=inline&height=650&margin=%5Bobject%20Object%5D&name=image.png&originHeight=650&originWidth=793&size=57924&status=done&style=none&width=793)
  2. <a name="ySDyp"></a>
  3. # 4.关于更多可视化
  4. **`dash_core_components`**库包含一个名为`**Graph**`的组件。<br />`Graph`使用开源的`plotly.js` `JavaScript`图形库呈现交互式数据可视化。js支持超过35种图表类型,用矢量质量的SVG和高性能的WebGL渲染图表。<br />**`dash_core_components`**中的图参数。图形组件与**`plotly`**使用的图形参数相同。**`Plotly`**的开源Python图形库。请查看plotly.py文档和图库以了解更多信息。Check out the [plotly.py documentation and gallery](https://plotly.com/python) to learn more.
  5. ```python
  6. # Run this app with `python app.py` and
  7. # visit http://127.0.0.1:8050/ in your web browser.
  8. import dash
  9. import dash_core_components as dcc
  10. import dash_html_components as html
  11. import plotly.express as px
  12. import pandas as pd
  13. external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
  14. app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
  15. df = pd.read_csv('https://gist.githubusercontent.com/chriddyp/5d1ea79569ed194d432e56108a04d188/raw/a9f9e8076b837d541398e999dcbac2b2826a81f8/gdp-life-exp-2007.csv')
  16. fig = px.scatter(df, x="gdp per capita", y="life expectancy",
  17. size="population", color="continent", hover_name="country",
  18. log_x=True, size_max=60)
  19. app.layout = html.Div([
  20. dcc.Graph(
  21. id='life-exp-vs-gdp',
  22. figure=fig
  23. )
  24. ])
  25. if __name__ == '__main__':
  26. app.run_server(debug=True)

image.png 这些图形是交互式和响应性的。将鼠标悬停在点上可以看到它们的值,单击图例项目可以切换轨迹,单击并拖动可以缩放,按住shift键,单击并拖动可以平移。

5.Markdown

虽然Dash通过dash_html_components库显示**HTML**,但用HTML编写副本可能会很乏味。为了编写文本块,可以使用dash_core_components库中的Markdown组件。代码如下:

  1. # Run this app with `python app.py` and
  2. # visit http://127.0.0.1:8050/ in your web browser.
  3. import dash
  4. import dash_core_components as dcc
  5. import dash_html_components as html
  6. external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
  7. app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
  8. markdown_text = '''
  9. ### Dash and Markdown
  10. Dash apps can be written in Markdown.
  11. Dash uses the [CommonMark](http://commonmark.org/)
  12. specification of Markdown.
  13. Check out their [60 Second Markdown Tutorial](http://commonmark.org/help/)
  14. if this is your first introduction to Markdown!
  15. '''
  16. app.layout = html.Div([
  17. dcc.Markdown(children=markdown_text)
  18. ])
  19. if __name__ == '__main__':
  20. app.run_server(debug=True)

image.png

6.核心组件

dash_core_components包括一组更高级的组件,如下拉列表、图表、markdown块等。
像所有的Dash组件一样,它们都是用声明的方式描述的。每个可配置的选项都可以作为组件的关键字参数。
可以在【 Dash Core Components Gallery】网站中,查看所有的核心组件。

  1. # -*- coding: utf-8 -*-
  2. # Run this app with `python app.py` and
  3. # visit http://127.0.0.1:8050/ in your web browser.
  4. import dash
  5. import dash_core_components as dcc
  6. import dash_html_components as html
  7. external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
  8. app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
  9. app.layout = html.Div([
  10. html.Label('Dropdown'),
  11. dcc.Dropdown(
  12. options=[
  13. {'label': 'New York City', 'value': 'NYC'},
  14. {'label': u'Montréal', 'value': 'MTL'},
  15. {'label': 'San Francisco', 'value': 'SF'}
  16. ],
  17. value='MTL'
  18. ),
  19. html.Label('Multi-Select Dropdown'),
  20. dcc.Dropdown(
  21. options=[
  22. {'label': 'New York City', 'value': 'NYC'},
  23. {'label': u'Montréal', 'value': 'MTL'},
  24. {'label': 'San Francisco', 'value': 'SF'}
  25. ],
  26. value=['MTL', 'SF'],
  27. multi=True
  28. ),
  29. html.Label('Radio Items'),
  30. dcc.RadioItems(
  31. options=[
  32. {'label': 'New York City', 'value': 'NYC'},
  33. {'label': u'Montréal', 'value': 'MTL'},
  34. {'label': 'San Francisco', 'value': 'SF'}
  35. ],
  36. value='MTL'
  37. ),
  38. html.Label('Checkboxes'),
  39. dcc.Checklist(
  40. options=[
  41. {'label': 'New York City', 'value': 'NYC'},
  42. {'label': u'Montréal', 'value': 'MTL'},
  43. {'label': 'San Francisco', 'value': 'SF'}
  44. ],
  45. value=['MTL', 'SF']
  46. ),
  47. html.Label('Text Input'),
  48. dcc.Input(value='MTL', type='text'),
  49. html.Label('Slider'),
  50. dcc.Slider(
  51. min=0,
  52. max=9,
  53. marks={i: 'Label {}'.format(i) if i == 1 else str(i) for i in range(1, 6)},
  54. value=5,
  55. ),
  56. ], style={'columnCount': 2})
  57. if __name__ == '__main__':
  58. app.run_server(debug=True)

image.png

总结

Dash应用程序的**layout**描述了应用程序的外观。**layout**是一个组件的分层树。dash_html_components库为所有HTML标记提供了类,关键字参数描述了HTML属性,如layout、ClassName和iddash_core_components库生成高级组件,如控件和图形