Me gustaría seleccionar el rango en el eje angular en un diagrama polar Plotly , y me pregunto cuál es la forma más fácil de hacerlo. Idealmente, si hago clic y arrastro de 30 a 90 grados, me gustaría tener el rango de 30 a 90 grados; si hago clic y arrastro de 330 a 30 grados, entonces me gustaría tener el rango de 330 a 30 grados.
No sé mucho sobre Plotly , pero me pregunto si relayoutData es algo que se pueda aprovechar. Actualmente solo devuelve el rango en el eje radial (ver el rango devuelto por relayoutData en la imagen). Me pregunto si se puede cambiar un parámetro para que devuelva el rango del eje angular.
Aquí está el código mínimo para generar la figura de arriba
import json import dash import dash_core_components as dcc import dash_html_components as html from dash.dependencies import Input, Output import plotly.express as px import pandas as pd app = dash.Dash(__name__) df = px.data.wind() fig = px.scatter_polar(df, r="frequency", theta="direction") app.layout = html.Div([ dcc.Graph( id='basic-interactions', figure=fig ), html.Div(className='row', children=[ html.Div([ dcc.Markdown(""" **Zoom and Relayout Data** Click and drag on the graph to zoom or click on the zoom buttons in the graph's menu bar. Clicking on legend items will also fire this event. """), html.Pre(id='relayout-data'), ]) ]) ]) @app.callback( Output('relayout-data', 'children'), Input('basic-interactions', 'relayoutData')) def display_relayout_data(relayoutData): return json.dumps(relayoutData, indent=2) if __name__ == '__main__': app.run_server(debug=True) import json import dash import dash_core_components as dcc import dash_html_components as html from dash.dependencies import Input, Output, State import plotly.express as px import plotly.graph_objects as go import pandas as pd from jupyter_dash import JupyterDash # Build App app = JupyterDash(__name__) # app = dash.Dash(__name__) df = px.data.wind() fig = px.scatter_polar(df, r="frequency", theta="direction") # data to translate named direction to degrees dfd = pd.read_html("http://snowfence.umn.edu/Components/winddirectionanddegrees.htm")[1] dfd.columns = dfd.loc[0] dfd = ( dfd.drop([0]) .dropna() .set_index("Cardinal Direction")["Degree Direction"] .apply(lambda v: pd.Series(v.split(" - ")).astype(float)) ) app.layout = html.Div( [ dcc.Graph(id="basic-interactions", figure=fig), html.Div( className="row", children=[ html.Div( [ dcc.Markdown( """ **Selected points** Use lasso to select points. Double-click de-select for reset """ ), html.Pre(id="relayout-data"), ] ) ], ), ] ) @app.callback( Output("relayout-data", "children"), Input("basic-interactions", "selectedData"), ) def display_relayout_data(selectedData): global dfd def degrees(wind_dir): return dfd.loc[wind_dir, 0].min(), dfd.loc[wind_dir, 1].max() if selectedData: wind_dir = [p["theta"] for p in selectedData["points"]] return f"{degrees(wind_dir)} {wind_dir}" else: raise dash.exceptions.PreventUpdate if __name__ == "__main__": # app.run_server(debug=True) app.run_server(mode="inline")