--- jupyter: jupytext: notebook_metadata_filter: all text_representation: extension: .md format_name: markdown format_version: '1.2' jupytext_version: 1.6.0 kernelspec: display_name: Python 3 language: python name: python3 language_info: codemirror_mode: name: ipython version: 3 file_extension: .py mimetype: text/x-python name: python nbconvert_exporter: python pygments_lexer: ipython3 version: 3.7.6 plotly: description: How to make a graph with multiple axes (dual y-axis plots, plots with secondary axes) in python. display_as: file_settings language: python layout: base name: Multiple Axes order: 16 permalink: python/multiple-axes/ thumbnail: thumbnail/multiple-axes.jpg --- ### Multiple Y Axes and Plotly Express [Plotly Express](/python/plotly-express/) is the easy-to-use, high-level interface to Plotly, which [operates on a variety of types of data](/python/px-arguments/) and produces [easy-to-style figures](/python/styling-plotly-express/). > *Note*: At this time, Plotly Express does not support multiple Y axes on a single figure. To make such a figure, use the [`make_subplots()`](/python/subplots/) function in conjunction with [graph objects](/python/graph-objects/) as documented below. #### Two Y Axes ```python import plotly.graph_objects as go from plotly.subplots import make_subplots # Create figure with secondary y-axis fig = make_subplots(specs=[[{"secondary_y": True}]]) # Add traces fig.add_trace( go.Scatter(x=[1, 2, 3], y=[40, 50, 60], name="yaxis data"), secondary_y=False, ) fig.add_trace( go.Scatter(x=[2, 3, 4], y=[4, 5, 6], name="yaxis2 data"), secondary_y=True, ) # Add figure title fig.update_layout( title_text="Double Y Axis Example" ) # Set x-axis title fig.update_xaxes(title_text="xaxis title") # Set y-axes titles fig.update_yaxes(title_text="primary yaxis title", secondary_y=False) fig.update_yaxes(title_text="secondary yaxis title", secondary_y=True) fig.show() ``` ### Multiple axes in Dash [Dash](https://plotly.com/dash/) is the best way to build analytical apps in Python using Plotly figures. To run the app below, run `pip install dash`, click "Download" to get the code and run `python app.py`. Get started with [the official Dash docs](https://dash.plotly.com/installation) and **learn how to effortlessly [style](https://plotly.com/dash/design-kit/) & [deploy](https://plotly.com/dash/app-manager/) apps like this with Dash Enterprise.** ```python hide_code=true from IPython.display import IFrame snippet_url = 'https://dash-gallery.plotly.host/python-docs-dash-snippets/' IFrame(snippet_url + 'multiple-axes', width='100%', height=630) ``` #### Multiple Y-Axes Subplots ```python import plotly.graph_objects as go from plotly.subplots import make_subplots fig = make_subplots(rows=2, cols=2, specs=[[{"secondary_y": True}, {"secondary_y": True}], [{"secondary_y": True}, {"secondary_y": True}]]) # Top left fig.add_trace( go.Scatter(x=[1, 2, 3], y=[2, 52, 62], name="yaxis data"), row=1, col=1, secondary_y=False) fig.add_trace( go.Scatter(x=[1, 2, 3], y=[40, 50, 60], name="yaxis2 data"), row=1, col=1, secondary_y=True, ) # Top right fig.add_trace( go.Scatter(x=[1, 2, 3], y=[2, 52, 62], name="yaxis3 data"), row=1, col=2, secondary_y=False, ) fig.add_trace( go.Scatter(x=[1, 2, 3], y=[40, 50, 60], name="yaxis4 data"), row=1, col=2, secondary_y=True, ) # Bottom left fig.add_trace( go.Scatter(x=[1, 2, 3], y=[2, 52, 62], name="yaxis5 data"), row=2, col=1, secondary_y=False, ) fig.add_trace( go.Scatter(x=[1, 2, 3], y=[40, 50, 60], name="yaxis6 data"), row=2, col=1, secondary_y=True, ) # Bottom right fig.add_trace( go.Scatter(x=[1, 2, 3], y=[2, 52, 62], name="yaxis7 data"), row=2, col=2, secondary_y=False, ) fig.add_trace( go.Scatter(x=[1, 2, 3], y=[40, 50, 60], name="yaxis8 data"), row=2, col=2, secondary_y=True, ) fig.show() ``` #### Multiple Axes Low-level API for creating a figure with multiple axes ```python import plotly.graph_objects as go fig = go.Figure() fig.add_trace(go.Scatter( x=[1, 2, 3], y=[4, 5, 6], name="yaxis1 data" )) fig.add_trace(go.Scatter( x=[2, 3, 4], y=[40, 50, 60], name="yaxis2 data", yaxis="y2" )) fig.add_trace(go.Scatter( x=[4, 5, 6], y=[40000, 50000, 60000], name="yaxis3 data", yaxis="y3" )) fig.add_trace(go.Scatter( x=[5, 6, 7], y=[400000, 500000, 600000], name="yaxis4 data", yaxis="y4" )) # Create axis objects fig.update_layout( xaxis=dict( domain=[0.3, 0.7] ), yaxis=dict( title="yaxis title", titlefont=dict( color="#1f77b4" ), tickfont=dict( color="#1f77b4" ) ), yaxis2=dict( title="yaxis2 title", titlefont=dict( color="#ff7f0e" ), tickfont=dict( color="#ff7f0e" ), anchor="free", overlaying="y", side="left", position=0.15 ), yaxis3=dict( title="yaxis3 title", titlefont=dict( color="#d62728" ), tickfont=dict( color="#d62728" ), anchor="x", overlaying="y", side="right" ), yaxis4=dict( title="yaxis4 title", titlefont=dict( color="#9467bd" ), tickfont=dict( color="#9467bd" ), anchor="free", overlaying="y", side="right", position=0.85 ) ) # Update layout properties fig.update_layout( title_text="multiple y-axes example", width=800, ) fig.show() ``` #### Reference All of the y-axis properties are found here: https://plotly.com/python/reference/YAxis/. For more information on creating subplots see the [Subplots in Python](/python/subplots/) section.