使用for循环创建Plotly饼图子图时遇类型不兼容错误
解决Plotly饼图子图兼容问题
错误原因
你碰到的问题是make_subplots默认创建的是xy类型子图(适配折线、柱状这类依赖坐标轴的图表),但饼图属于domain类型子图,两种子图类型不兼容,所以触发报错。
修正方案
1. 指定子图类型
在make_subplots调用时加上subplot_type='domain',明确告诉Plotly要创建适配饼图的domain布局子图。
2. 移除无效的domain参数
原代码里的domain=dict(x=[1,1])会把饼图压缩到完全不可见的位置,而且用子图布局时不需要手动设置domain,Plotly会自动分配每个子图的显示区域。
3. 修正行列计算逻辑
原代码里的math.floor(i/7+1)计算列数有误,改用整数除法i//7 +1更直观准确。
修正后的完整代码
from plotly.subplots import make_subplots import plotly.graph_objects as go # 创建7行2列的domain类型子图 fig = make_subplots(rows=7, cols=2, subplot_type='domain') 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) # 计算当前子图的行和列 row = i % 7 + 1 col = i // 7 + 1 # 添加饼图轨迹,无需手动设置domain fig.add_trace( go.Pie(values=grouped['TradeValue(Us$)'], labels=grouped['Commodity']), row=row, col=col ) # 可按需调整整体布局 fig.update_layout(height=1800, width=1000, title_text="各年度Top10商品贸易额占比") fig.show()
额外优化
如果想给每个子图添加对应年份的标题,可在循环内加入以下代码:
fig.update_layout( **{f"title_{row}_{col}": f"Year {year}"} )
内容的提问来源于stack exchange,提问作者beridzeg45
相关产品推荐
相关产品推荐

