illuminato
illuminato

Reputation: 1257

Plotly: How to adjust the space between axis labels and plot area?

How can I adjust space between axis labels and plot area in Plotly? In particularly I am interesting in decreasing space between axis labels and plot area. I've attached a screenshot with an example.

enter image description here

Here is reproducible code snippet:

import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly.graph_objs as go
import plotly.express as px
import pandas as pd
import numpy as np

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

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


df = pd.read_csv("data.txt", sep='\t', parse_dates=["StartTimeRun", "EndTimeRun"])
df = df[df['Status'] != 'NOT_RUN']
df = df[df['Status2'] != 'NOT_RUN']

# assume you have a "long-form" data frame
# see https://plotly.com/python/px-arguments/ for more options
df_PASS = df.loc[df['Status'] == "PASS"]
df_FAIL = df.loc[df['Status'] == "FAIL"]
trace1 = go.Box(x=df_PASS["Duration(seconds)"], y=df_PASS["Keyword"], name="PASS", orientation='h', marker=dict(color='rgb(158,202,225)', line=dict(color='rgb(8,48,107)', width=1.5)))
trace2 = go.Box(x=df_FAIL["Duration(seconds)"], y=df_FAIL["Keyword"], name="FAIL", orientation='h', marker=dict(color='#fd9668', line=dict(color='rgb(8,48,107)', width=1.5)))
fig = {
    'data': [trace1, trace2],
    'layout':
    go.Layout(
        boxmode='group',  margin=dict(l=200, r=150)
    )
}

app.layout = html.Div(children=[
    html.H1(children='Hello Dash'),

    html.Div(children='''
        Dash: A web application framework for Python.
    '''),

    dcc.Graph(
        id='example-graph',
        figure=fig
    )
])

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

And here is the dataframe (data.txt):

SuiteName   Test    Status  Keyword Status2 Duration(seconds)   StartTimeRun    EndTimeRun  Type    FileName
0SmokeTestDD    Validate the use case for Single UE PASS    BuiltIn.Run Keywords    FAIL    12.619  20200809 06:45:18.515   20200809 06:45:31.134   setup   output-20200809-064513.xml
0SmokeTestDD    Validate the use case for Single UE PASS    Validate the work flow  PASS    34.56   20200809 06:45:31.135   20200809 06:49:25.695   kw  output-20200809-064513.xml
0SmokeTestDD    Validate the use case for Single UE PASS    BuiltIn.Run Keywords    PASS    15.344  20200809 06:49:25.695   20200809 06:49:41.039   teardown    output-20200809-064513.xml
Validate the use case for Single UE Validate the work flow  PASS    Login To    FAIL    8.502   20200809 06:45:31.135   20200809 06:45:39.637   kw  output-20200809-064513.xml
Validate the use case for Single UE Validate the work flow  PASS    Select Technology   PASS    1.243   20200809 06:45:39.637   20200809 06:45:55.880   kw  output-20200809-064513.xml
Validate the use case for Single UE Validate the work flow  PASS    Select Menu PASS    7.147   20200809 06:45:55.880   20200809 06:46:03.027   kw  output-20200809-064513.xml
Validate the use case for Single UE Validate the work flow  PASS    BuiltIn.Log FAIL    0.001   20200809 06:46:03.027   20200809 06:46:03.028   kw  output-20200809-064513.xml
Validate the use case for Single UE Validate the work flow  PASS    BuiltIn.Sleep   PASS    5.0 20200809 06:46:03.028   20200809 06:46:08.028   kw  output-20200809-064513.xml

Hope this snippet will help to find answer.

Upvotes: 15

Views: 29455

Answers (5)

Matthias Luh
Matthias Luh

Reputation: 623

Another option is to use outside ticks with a specified ticklen and paint them in the paper color (maybe even transparently somehow?):

import plotly.graph_objects as go

labels = ['giraffes', 'orangutans', 'monkeys']
fig = go.Figure(go.Bar(x=[20, 14, 23], y=labels, orientation='h'))
fig.update_yaxes(ticks="outside",
                 tickcolor="white",  # adjust color of the tick
                 ticklen=50  # adjust length of the tick = distance from axis
                 )

fig.show()

plotly axis label spacing

Also works with fig.update_xaxes.

Upvotes: 1

tomuelle
tomuelle

Reputation: 39

Actually you can just do :

fig.update_yaxes(
        title_standoff = 50
)

Upvotes: 3

GitHunter0
GitHunter0

Reputation: 584

I believe the best way is to do fig.update_yaxes(ticksuffix = " ") trick:

import plotly.graph_objects as go

labels = ['giraffes', 'orangutans', 'monkeys']

fig = go.Figure(go.Bar(x=[20, 14, 23], y=labels, orientation='h'))

# Adjust for your purposes the width of the blank space in "  "
fig.update_yaxes(ticksuffix = "  ")

fig.show()

Upvotes: 12

Derek O
Derek O

Reputation: 19647

Unfortunately there is no good way to do this in Plotly. Plotly is great for creating interactive plots, but at the cost of tunability.

The only "workaround" I can think of (and it's not great) is to make the plot background the same color as the browser background, change the gridcolor to something different from your browser background, then add padding. (In my example, I assume the browser background is white). However, this will pad both the x- and y-axes, and I can't find a way around this.

import pandas as pd
import plotly.graph_objects as go

df = pd.DataFrame({'ColumnA':[1,2,3,4,5], 'ColumnB':[5,6,7,8,9], 'ColumnC':[6,7,8,9,10]})
trace1 = go.Box(x=df['ColumnA'],orientation='h')
trace2 = go.Box(x=df['ColumnB'],orientation='h')
trace3 = go.Box(x=df['ColumnB'],orientation='h')

fig = go.Figure(data=[trace1, trace2, trace3])
fig.update_layout(
    boxmode='group', 
    boxgap=0.25,
    boxgroupgap=0.25,
    height=500, 
    paper_bgcolor='rgba(0,0,0,0)', 
    plot_bgcolor='rgba(0,0,0,0)',
    xaxis=dict(gridcolor='lightgrey'),
    margin=dict(l=600, r=150, b=10, pad=100)
)
fig.show()

enter image description here

Upvotes: 9

rex
rex

Reputation: 41

If tick marks are available to adjust and depending on your data, you can add spaces to tick marks. The spaces can be added using a list comprehension, like this:

spaces = ' '* 25
labels = ['giraffes', 'orangutans', 'monkeys']
newLabels = [label+spaces for label in labels]

Here is an example using tickmarks and spaces:

import plotly.graph_objects as go
spaces = ' '* 25
labels = ['giraffes', 'orangutans', 'monkeys']

newLabels = [label+spaces for label in labels]

fig = go.Figure(go.Bar(
            x=[20, 14, 23],
            y=newLabels,
            orientation='h'))

fig.show()

enter image description here

Upvotes: 4

Related Questions