Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I put different legends to subplots in plotly?

I am still designing what kind of plot with subplots I want to do but when we see the example in the documentation Multiple Subplots with Titles we have

from plotly.subplots import make_subplots
import plotly.graph_objects as go

fig = make_subplots(
    rows=2, cols=2,
    subplot_titles=("Plot 1", "Plot 2", "Plot 3", "Plot 4"))

fig.add_trace(go.Scatter(x=[1, 2, 3], y=[4, 5, 6]),
              row=1, col=1)

fig.add_trace(go.Scatter(x=[20, 30, 40], y=[50, 60, 70]),
              row=1, col=2)

fig.add_trace(go.Scatter(x=[300, 400, 500], y=[600, 700, 800]),
              row=2, col=1)

fig.add_trace(go.Scatter(x=[4000, 5000, 6000], y=[7000, 8000, 9000]),
              row=2, col=2)

fig.update_layout(height=500, width=700,
                  title_text="Multiple Subplots with Titles")

fig.show()

which gives

plot with subplots

which is fine but notice that there is only one place for the legends.(trace 0, trace 1.etc)

In my design the upper left plot has one legend and the other three share some other legend . Is there a way to individualize or customize the legends of subplots?

like image 930
KansaiRobot Avatar asked Oct 31 '25 21:10

KansaiRobot


1 Answers

This topic was discussed on the plotly forum here, and it seems that multiple legends aren't possible in plotly. However, in the same thread @Jaydeep Mistry gives a partial workaround.

He uses legend groups to group traces together, then uses the parameter legend_tracegroupgap in the update_layout method to give the legend the appearance of being more than one legend. However, this spacing only works vertically so your multiple legends will still be vertically spaced apart on the right side of the plot. For example:

from plotly.subplots import make_subplots
import plotly.graph_objects as go

fig = make_subplots(
    rows=2, cols=2,
    subplot_titles=("Plot 1", "Plot 2", "Plot 3", "Plot 4"))

fig.add_trace(go.Scatter(x=[1, 2, 3], y=[4, 5, 6], legendgroup = '1'),
              row=1, col=1)

fig.add_trace(go.Scatter(x=[20, 30, 40], y=[50, 60, 70], legendgroup = '2'),
              row=1, col=2)

fig.add_trace(go.Scatter(x=[300, 400, 500], y=[600, 700, 800], legendgroup = '2'),
              row=2, col=1)

fig.add_trace(go.Scatter(x=[4000, 5000, 6000], y=[7000, 8000, 9000], legendgroup = '2'),
              row=2, col=2)

fig.update_layout(height=500, width=700,
                  title_text="Multiple Subplots with Titles",
                  legend_tracegroupgap=180)

fig.show()

enter image description here

Alternatively, you could add another legend by using an annotation to draw a box with the accompanying text, but it wouldn't have any functionality.

like image 66
Derek O Avatar answered Nov 03 '25 10:11

Derek O



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!