> **AI assistant tip:** These docs are also served over MCP at https://dash.plotly.com/_mcp. That endpoint requires a one-time OAuth sign-in with a Plotly Cloud account (free), which your user must perform in the browser. See setup instructions at https://dash.plotly.com/mcp. Reading pages as Markdown, as you are doing now, does not require authentication. # Dash Layout > This is the 1st chapter of the Dash Fundamentals. > > The [next chapter](https://dash.plotly.com/basic-callbacks) covers Dash callbacks. This tutorial will walk you through a fundamental aspect of Dash apps, the app `layout`, through six self-contained apps. For production Dash apps, we recommend styling the app `layout` with Dash Enterprise [Design Kit](https://plotly.com/dash/design-kit/?source=dash_docs&medium=documentation&content=layout). --- Dash apps are composed of two parts. The first part is the “`layout`”, which describes what the app looks like. The second part describes the interactivity of the app and will be covered in the [next chapter](https://dash.plotly.com/basic-callbacks). Note: Throughout this documentation, each Python code example can be run either by saving it to an `app.py` file and using `python app.py` or by running it in a Jupyter notebook cell. > If you’re using Dash Enterprise’s [Data Science Workspaces](https://plotly.com/dash/workspaces/?source=dash_docs&medium=documentation&content=layout), > > copy & paste the below code into your Workspace ([see video](https://plotly.com/dash/workspaces/?source=dash_docs&medium=documentation&content=layout#screencast)). > > *[Find out if your company is using Dash Enterprise](https://plotly.com/company-lookup/?source=dash_docs&medium=documentation&content=layout)* To get started, create a file named `app.py`, copy the code below into it, and then run it with `python app.py`. ``` # Run this app with `python app.py` and # visit http://127.0.0.1:8050/ in your web browser. from dash import Dash, html, dcc import plotly.express as px import pandas as pd app = Dash() # assume you have a "long-form" data frame # see https://plotly.com/python/px-arguments/ for more options df = pd.DataFrame({ "Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"], "Amount": [4, 1, 2, 2, 4, 5], "City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"] }) fig = px.bar(df, x="Fruit", y="Amount", color="City", barmode="group") app.layout = html.Div(children=[ html.H1(children='Hello Dash'), html.Div(children=''' Dash: A web application framework for your data. '''), dcc.Graph( id='example-graph', figure=fig ) ]) if __name__ == '__main__': app.run(debug=True) ``` ``` $ python app.py ...Running on http://127.0.0.1:8050/ (Press CTRL+C to quit) ``` Visit in your web browser. You should see an app that looks like the one above. Note: 1. The `layout` is composed of a tree of “components” such as `html.Div` and `dcc.Graph`. 2. The Dash HTML Components module (`dash.html`) has a component for every HTML tag. The `html.H1(children='Hello Dash')` component generates a `<h1>Hello Dash<h1>` HTML element in your app. 3. Not all components are pure HTML. The Dash Core Components module (`dash.dcc`) contains higher-level components that are interactive and are generated with JavaScript, HTML, and CSS through the React.js library. 4. Each component is described entirely through keyword attributes. Dash is *declarative*: you will primarily describe your app through these attributes. 5. The `children` property is special. By convention, it’s always the first attribute which means that you can omit it: `html.H1(children='Hello Dash')` is the same as `html.H1('Hello Dash')`. It can contain a string, a number, a single component, or a list of components. 6. The fonts in your app will look a little bit different than what is displayed here. This app is using a custom CSS stylesheet and Dash Enterprise [Design Kit](https://plotly.com/dash/design-kit/?source=dash_docs&medium=documentation&content=layout) to modify the default styles of the elements. You can learn more about custom CSS in the [CSS tutorial](https://dash.plotly.com/external-resources). ## Making Your First Change Dash includes “hot-reloading”. This feature is activated by default when you run your app with `app.run(debug=True)`. This means that Dash will automatically refresh your browser when you make a change in your code. Give it a try: change the title “Hello Dash” in your app or change the `x` or the `y` data. Your app should auto-refresh with your change. > Don’t like hot-reloading? You can turn this off with python `app.run(dev_tools_hot_reload=False)`. > > Learn more in [Dash Dev Tools documentation](https://dash.plotly.com/devtools) > > Questions? See the [community forum hot reloading discussion](https://community.plotly.com/t/announcing-hot-reload/14177). ## More about HTML Components Dash HTML Components (`dash.html`) contains a component class for every HTML tag as well as keyword arguments for all of the HTML arguments. Let’s customize the text in our app by modifying the inline styles of the components. Create a file named `app.py` with the following code: ``` # Run this app with `python app.py` and # visit http://127.0.0.1:8050/ in your web browser. from dash import Dash, dcc, html import plotly.express as px import pandas as pd app = Dash() colors = { 'background': '#111111', 'text': '#7FDBFF' } # assume you have a "long-form" data frame # see https://plotly.com/python/px-arguments/ for more options df = pd.DataFrame({ "Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"], "Amount": [4, 1, 2, 2, 4, 5], "City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"] }) fig = px.bar(df, x="Fruit", y="Amount", color="City", barmode="group") fig.update_layout( plot_bgcolor=colors['background'], paper_bgcolor=colors['background'], font_color=colors['text'] ) app.layout = html.Div(style={'backgroundColor': colors['background']}, children=[ html.H1( children='Hello Dash', style={ 'textAlign': 'center', 'color': colors['text'] } ), html.Div(children='Dash: A web application framework for your data.', style={ 'textAlign': 'center', 'color': colors['text'] }), dcc.Graph( id='example-graph-2', figure=fig ) ]) if __name__ == '__main__': app.run(debug=True) ``` In this example, we modified the inline styles of the `html.Div` and `html.H1`components with the `style` property. ``` html.H1('Hello Dash', style={'textAlign': 'center', 'color': '#7FDBFF'}) ``` The above code is rendered in the Dash app as `<h1>Hello Dash<h1>`. There are a few important differences between the `dash.html` and the HTML attributes: 1. The `style` property in HTML is a semicolon-separated string. In Dash, you can just supply a dictionary. 2. The keys in the `style` dictionary are [camelCased](https://en.wikipedia.org/wiki/Camel_case). So, instead of `text-align`, it’s `textAlign`. 3. The HTML `class` attribute is `className` in Dash. 4. The children of the HTML tag is specified through the `children` keyword argument. By convention, this is always the *first* argument and so it is often omitted. Besides that, all of the available HTML attributes and tags are available to you within your Python context. --- ### Reusable Components By writing our markup in Python, we can create complex reusable components like tables without switching contexts or languages. Here’s a quick example that generates a `Table` from a Pandas dataframe. Create a file named `app.py` with the following code: ``` # Run this app with `python app.py` and # visit http://127.0.0.1:8050/ in your web browser. from dash import Dash, 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)) ]) ]) app = Dash() app.layout = html.Div([ html.H4(children='US Agriculture Exports (2011)'), generate_table(df) ]) if __name__ == '__main__': app.run(debug=True) ``` ## More about Visualization The Dash Core Components module (`dash.dcc`) includes a component called `Graph` that renders interactive data visualizations using the open source [plotly.js](https://github.com/plotly/plotly.js) JavaScript graphing library. Plotly.js supports over 35 chart types and renders charts in both vector-quality SVG and high-performance WebGL. Check out the [plotly.py documentation and gallery](https://plotly.com/python) to learn more. Here’s an example that creates a scatter plot from a Pandas dataframe. Create a file named `app.py` with the following code: ``` # Run this app with `python app.py` and # visit http://127.0.0.1:8050/ in your web browser. from dash import Dash, dcc, html import plotly.express as px import pandas as pd app = Dash() df = pd.read_csv('https://gist.githubusercontent.com/chriddyp/5d1ea79569ed194d432e56108a04d188/raw/a9f9e8076b837d541398e999dcbac2b2826a81f8/gdp-life-exp-2007.csv') fig = px.scatter(df, x="gdp per capita", y="life expectancy", size="population", color="continent", hover_name="country", log_x=True, size_max=60) app.layout = html.Div([ dcc.Graph( id='life-exp-vs-gdp', figure=fig ) ]) if __name__ == '__main__': app.run(debug=True) ``` *These graphs are interactive and responsive.**Hover* *over points to see their values,**click* *on legend items to toggle traces,**click and drag* *to zoom,**hold down shift, and click and drag* *to pan.* ## Markdown While Dash exposes HTML through Dash HTML Components (`dash.html`), it can be tedious to write your copy in HTML. For writing blocks of text, you can use the `Markdown` component in Dash Core Components (`dash.dcc`). Create a file named `app.py` with the following code: ``` # Run this app with `python app.py` and # visit http://127.0.0.1:8050/ in your web browser. from dash import Dash, html, dcc app = Dash() markdown_text = ''' ### Dash and Markdown Dash apps can be written in Markdown. Dash uses the [CommonMark](https://commonmark.org/) specification of Markdown. Check out their [60 Second Markdown Tutorial](https://commonmark.org/help/) if this is your first introduction to Markdown! ''' app.layout = html.Div([ dcc.Markdown(children=markdown_text) ]) if __name__ == '__main__': app.run(debug=True) ``` ## Core Components Dash Core Components (`dash.dcc`) includes a set of higher-level components like dropdowns, graphs, markdown blocks, and more. Like all Dash components, they are described entirely declaratively. Every option that is configurable is available as a keyword argument of the component. We’ll see many of these components throughout the tutorial. You can view all of the available components in the [Dash Core Components overview](https://dash.plotly.com/dash-core-components). Here are a few of the available components. Create a file named `app.py` with the following code: ``` # Run this app with `python app.py` and # visit http://127.0.0.1:8050/ in your web browser. from dash import Dash, html, dcc app = Dash() app.layout = html.Div([ html.Div(children=[ html.Label('Dropdown'), dcc.Dropdown(['New York City', 'Montréal', 'San Francisco'], 'Montréal'), html.Br(), html.Label('Multi-Select Dropdown'), dcc.Dropdown(['New York City', 'Montréal', 'San Francisco'], ['Montréal', 'San Francisco'], multi=True), html.Br(), html.Label('Radio Items'), dcc.RadioItems(['New York City', 'Montréal', 'San Francisco'], 'Montréal'), ], style={'padding': 10, 'flex': 1}), html.Div(children=[ html.Label('Checkboxes'), dcc.Checklist(['New York City', 'Montréal', 'San Francisco'], ['Montréal', 'San Francisco'] ), html.Br(), html.Label('Text Input'), dcc.Input(value='MTL', type='text'), html.Br(), html.Label('Slider'), dcc.Slider( min=0, max=9, marks={i: f'Label {i}' if i == 1 else str(i) for i in range(1, 6)}, value=5, ), ], style={'padding': 10, 'flex': 1}) ], style={'display': 'flex', 'flexDirection': 'row'}) if __name__ == '__main__': app.run(debug=True) ``` ## Help Dash components are declarative: every configurable aspect of these components is set during instantiation as a keyword argument. Call `help` in your Python console on any of the components to learn more about a component and its available arguments. ``` >>> help(dcc.Dropdown) class Dropdown(dash.development.base_component.Component) | A Dropdown component. | Dropdown is an interactive dropdown element for selecting one or more | items. | The values and labels of the dropdown items are specified in the `options` | property and the selected item(s) are specified with the `value` property. | | Use a dropdown when you have many options (more than 5) or when you are | constrained for space. Otherwise, you can use RadioItems or a Checklist, | which have the benefit of showing the users all of the items at once. | | Keyword arguments: | - id (string; optional) | - className (string; optional) | - disabled (boolean; optional): If true, the option is disabled | - multi (boolean; optional): If true, the user can select multiple values | - options (list; optional) | - placeholder (string; optional): The grey, default text shown when no option is selected | - value (string | list; optional): The value of the input. If `multi` is false (the default) | then value is just a string that corresponds to the values | provided in the `options` property. If `multi` is true, then | multiple values can be selected at once, and `value` is an | array of items with values corresponding to those in the | `options` prop. ``` ## Summary The `layout` of a Dash app describes what the app looks like. The `layout` is a hierarchical tree of components, or a list of components (in Dash 2.17 and later). Dash HTML Components (`dash.html`) provides classes for all of the HTML tags and the keyword arguments describe the HTML attributes like `style`, `class`, and `id`. Dash Core Components (`dash.dcc`) generates higher-level components like controls and graphs. For reference, see: - [Dash Core Components overview](https://dash.plotly.com/dash-core-components) - [Dash HTML Components overview](https://dash.plotly.com/dash-html-components) --- The next part of the Dash Fundamentals covers how to make these apps interactive. [Go to Dash Fundamentals Part 2: Adding Interactivity](https://dash.plotly.com/basic-callbacks). --- [![Transform any dataset into a Dash app in minutes](https://dash.plotly.com/assets/images/plotly-studio.png)](https://plotly.com/studio/?source=dash_docs&medium=documentation&content=layout)