Home > Mobile >  Create plotly pie subplots using for loop
Create plotly pie subplots using for loop

Time:08-16

I am trying to create pie subplots using for loop.

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

fig = make_subplots(rows=7, cols=2)
for i,year in enumerate(sorted(df.Year.unique())):
    grouped=df[df.Year==year].groupby('Commodity')['TradeValue(Us$)'].sum().reset_index().sort_values('TradeValue(Us$)',ascending=False).head(10)

    fig.add_trace(go.Pie(values=grouped['TradeValue(Us$)'],labels=grouped['Commodity'],domain=dict(x=[1,1])),row=i%7 1,col=math.floor(i/7 1))
            
    #fig.update_layout(height=1800, width=1000, title_text="Commodity share in " str(year))
    #fig.update_xaxes(showticklabels=False)
fig.show()

I getthis error: Trace type 'pie' is not compatible with subplot type 'xy' at grid position (1, 1)

CodePudding user response:

You need to define type of each sub-plot

fig = make_subplots(
    rows=7,
    cols=2,
    specs=[[{"type": "domain"} for _ in range(2)] for _ in range(7)],
)

full MWE

Using your code and generating a compatible data frame

from plotly.subplots import make_subplots
import plotly.graph_objects as go
import math
import pandas as pd
import numpy as np

df = pd.DataFrame(
    {
        "Year": np.repeat([y for y in range(2012, 2023)], 5),
        "Commodity": np.random.choice(["Gold", "Silver", "Wheat"], 55),
        "TradeValue(Us$)": np.random.uniform(100, 10**5, 55),
    }
)

fig = make_subplots(
    rows=7,
    cols=2,
    specs=[[{"type": "domain"} for _ in range(2)] for _ in range(7)],
)

for i, year in enumerate(sorted(df.Year.unique())):
    grouped = (
        df[df.Year == year]
        .groupby("Commodity")["TradeValue(Us$)"]
        .sum()
        .reset_index()
        .sort_values("TradeValue(Us$)", ascending=False)
        .head(10)
    )

    fig.add_trace(
        go.Pie(
            values=grouped["TradeValue(Us$)"],
            labels=grouped["Commodity"],
            domain=dict(x=[1, 1]),
        ),
        row=i % 7   1,
        col=math.floor(i / 7   1),
    )

    # fig.update_layout(height=1800, width=1000, title_text="Commodity share in " str(year))
    # fig.update_xaxes(showticklabels=False)
fig.show()
  • Related