#python #plotly
#python #plotly
Вопрос:
Как я могу настроить пространство между метками осей и областью графика в Plotly? В частности, мне интересно уменьшить пространство между метками осей и областью графика. Я приложил скриншот с примером.
Вот воспроизводимый фрагмент кода:
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)
И вот фрейм данных (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
Надеюсь, этот фрагмент поможет найти ответ.
Ответ №1:
К сожалению, нет хорошего способа сделать это в Plotly. Plotly отлично подходит для создания интерактивных графиков, но за счет возможности настройки.
Единственный «обходной путь», который я могу придумать (и это не очень здорово), — сделать фон графика того же цвета, что и фон браузера, изменить цвет сетки на что-то отличное от фона вашего браузера, затем добавить отступы. (В моем примере я предполагаю, что фон браузера белый). Однако это приведет к заполнению обеих осей x и y, и я не могу найти способ обойти это.
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()
Ответ №2:
Я считаю, что лучший способ — это сделать fig.update_yaxes(ticksuffix = " ")
трюк:
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()
Комментарии:
1. Это было именно то, что мне было нужно, умное решение!
Ответ №3:
Если метки доступны для настройки и в зависимости от ваших данных, вы можете добавить пробелы к меткам. Пробелы могут быть добавлены с использованием понимания списка, например:
spaces = ' '* 25
labels = ['giraffes', 'orangutans', 'monkeys']
newLabels = [label spaces for label in labels]
Вот пример использования меток и пробелов:
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()
Комментарии:
1. Возможно ли уменьшить расстояние между метками осей и областью графика?
2. 25 в
spaces = ' '* 25
— это число. Вы можете свободно изменить это на любое число, соответствующее вашим потребностям 🙂3. Но я не могу изменить его на отрицательное число, хотя. Кроме того, я пытался изменить
[label spaces for label in labels]
на[spaces label for label in labels]
, но это также не уменьшило пространство между метками осей и областью графика. Между ними всегда есть пробел.
Ответ №4:
На самом деле вы можете просто сделать :
fig.update_yaxes(
title_standoff = 50
)