Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to obtain generated x-axis and y-axis range in plotly plot?

I have a very simple bubble chart, see below. the only thing i need is to be able to get the range (or the min and max) or the x and y axis generated.

trace = go.Scatter(
    x=df_test['total_points_mean'],
    y=df_test['total_points_std'],
    mode='markers',
    text=df_test['play_maker'],
    marker=dict(size=df_test['week_nunique'],
                color = df_test['week_nunique'],
                showscale=True)
)

layout = go.Layout(title='Scatter Plot')
fig = go.Figure(data=[trace],layout=layout)

From the resulting plot, the min and max of the x axis seems to be around ~10 and ~29, but i need a way to generate the exact value of the axis range.

enter image description here

Is there a way to access the generated axes range?

like image 764
Steven Cunden Avatar asked May 26 '20 20:05

Steven Cunden


People also ask

How do you set the X-axis range in Plotly?

Setting the Range of Axes Manually The visible x and y axis range can be configured manually by setting the range axis property to a list of two values, the lower and upper boundary. Here's an example of manually specifying the x and y axis range for a faceted scatter plot created with Plotly Express.

How do you rotate labels in Plotly?

Tickangle=90 means that the labels will be rotated by 90° clockwise. If you use the negative sign, you rotate the labels by 90° anti-clockwise, so just the other direction.


2 Answers

Getting the axis range from a plotly plot is not possible within the python implementation. You can only retrieve the range if you specify the axis range in your layout (but then you really don't need it).

So if you try print(fig.layout.xaxis.range) you will get None.

If you need the limits then you'll need to make your own and apply it to the layout:

  1. get the min and max of the x-values: xmin, xmax
  2. pad these values with some factor: xlim = [xmin*.95, xmax*1.05]
  3. update the layout: fig.update_layout(xaxis=dict(range=[xlim[0],xlim[1]]))

Now if you try print(fig.layout.xaxis.range) you'll get the axis range.

This was bugging me a great deal so I had to dig deeper, credit goes to @Emmanuelle on the plotly forums for confirming this reality.

UPDATE 20210129: Plotly has added .full_figure_for_development() method.

The .full_figure_for_development() method provides Python-level access to the default values computed by Plotly.js. This method requires the Kaleido package, which is easy to install and also used for static image export.

So now you can:

full_fig = fig.full_figure_for_development()
print(full_fig.layout.xaxis.range)
like image 60
jayveesea Avatar answered Oct 09 '22 13:10

jayveesea


If you have no access to the input data, but to the trace:

x_min = min(trace.x)
x_max = max(trace.x)

If you have no access to the trace but to the figure handle the following should work (I assume this is the usual case):

x_mins = []
x_maxs = []
for trace_data in fig.data:
    x_mins.append(min(trace_data.x))
    x_maxs.append(max(trace_data.x))
x_min = min(x_mins)
x_max = max(x_maxs)

I assume fig.layout.xaxis.range is None if the axis range is automatic.

like image 1
CodePrinz Avatar answered Oct 09 '22 13:10

CodePrinz