Search code examples
pythonplotlylegend-properties

Plotly: How to customize legend order?


I made scatter_geo plot in Python within plotly.

import plotly.express as px
import pandas as pd

rows = [['501-600', '65', '122.58333', '45.36667'],
        ['till 500', '54', '12.5', '27.5'],
        ['more 1001', '51', '-115.53333', '38.08'],
        ['601-1000', '54', '120.54167', '21.98'],
        ]

colmns = ['bins', 'data', 'longitude', 'latitude']
df = pd.DataFrame(data=rows, columns=colmns)

fig = px.scatter_geo(df, lon='longitude', lat='latitude', color='bins',
                     opacity=0.5,
                     projection="natural earth")
fig.show()

Is there any possibility to customise the order in legend labels if I have only one trace of data?

Coz now labels in legend look like this:

501-600
till 500
more 1001
601-1000

But I need to make them look like that:

till 500
501-600
601-1000
more 1001

Solution

  • If you take a look at traceorder you'll see that items are displayed top-to-bottom in the same order as the input data for the "normal" option. So you can just change the order of your input data to get what you want:

    enter image description here

    And if you'd like to specify an arbitrary order, you can do so by defining the order in the input data. Specifying row order can ba a bit tedious, so I often transpose the dataframe, order the categories that now appear in the column, and transpose it right back to its original form:

    order  = ['till 500', '501-600', '601-1000', 'more 1001']
    df_ordered = df.T[order].T
    

    With this order, the result will be the same as the figure above. Here's an updated code snippet:

    Complete code:

    import plotly.express as px
    import pandas as pd
    
    rows=[['501-600','65','122.58333','45.36667'],
          ['till 500','54','12.5','27.5'],
          ['more 1001','51','-115.53333','38.08'],
          ['601-1000','54','120.54167','21.98'],
          ]
    
    colmns=['bins','data','longitude','latitude']
    df=pd.DataFrame(data=rows, columns=colmns)
    
    fig=px.scatter_geo(df,lon='longitude', lat='latitude',color='bins',
                          opacity=0.5,
                          projection="natural earth")
    fig.show()
    
    
    order  = ['till 500', '501-600', '601-1000', 'more 1001']
    df = df.set_index('bins')
    df_ordered = df.T[order].T.reset_index()
    df_ordered
    
    fig2=px.scatter_geo(df_ordered,lon='longitude', lat='latitude',color='bins',
                          opacity=0.5,
                          projection="natural earth")
    fig2.show()