Search code examples
pythonplotplotly

How do I annotate each subplot separately in Plotly (Python)


I am trying to associate a separate annotation object with each subplot in Plotly (Python), how can this be done?

What I tried

I am setting up the plot like this:

from plotly import tools
fig = tools.make_subplots(rows=2, cols=1)
fig.append_trace(traces[0], 1, 1)
fig.append_trace(traces[1], 2, 1)

where each trace is formed like this:

import plotly.graph_objs as go
traces[0] = go.Scatter(
            x=[1,2,3,4],
            y=[4,4,2,1],
            mode='markers'
        )

I know I can access the xaxis of each subplot separately via:

fig['layout']['xaxis1'].update(title='hello1')
fig['layout']['xaxis2'].update(title='hello2')

But how can I access the annotation of each subplot? I tried "annotations1" and "annotation1", with no luck. I also tried to access the layout of subplot 1 via "layout1" as in:

fig['layout1'][...].update(...)

This did not work either.


Solution

  • 1) You could assign annotation to specific subplot through setting xref and yref with subplot axis id, such as x1 and y1 represents x axis and y axis of subplot1, as seen from example below and more on link

    fig['layout'].update(
        annotations=[
        dict(
            x=2, y=2, # annotation point
            xref='x1', 
            yref='y1',
            text='dict Text',
            showarrow=True,
            arrowhead=7,
            ax=10,
            ay=70
        ),
        dict(
            ...
            # if have multiple annotations
        )
    ])
    

    2) After you assigned it, you could get access to annotations through

    fig['layout']['annotations']
    

    which will return a list of dictionary items:

    [{'xref': 'x2', 'arrowhead': 7, 'yref': 'y2', 'text': 'dict Text', 'ay': 40, 'ax': 10, 'y': -1.9491807521563174, 'x': 0.77334098360655923, 'showarrow': True}, {'xref': 'x2', 'arrowhead': 7, 'yref': 'y2', 'text': 'dict Text', 'ay': -40, 'ax': 10, 'y': -0.0041268527747384542, 'x': 1.1132422279202281, 'showarrow': True}]
    

    Hope this could help ;)