Plotly多循环绘制2×3网格子图失败,请求技术帮助
解决Plotly 2×3子图布局异常问题
你的代码核心问题是三层循环嵌套导致每个子图被重复添加了所有num_cat_col列的箱线图,而非每个子图对应单个列的可视化。同时代码中的x变量未实际发挥作用,属于冗余代码。
要实现2×3网格的子图布局,每个子图对应num_cat_col中的一列,只需将列与子图位置一一映射,用单层循环即可完成:
import plotly.graph_objects as go from plotly.subplots import make_subplots plot_row = 2 plot_col = 3 # 确保列数与子图总数匹配(2*3=6),如果列数不同可调整逻辑 assert len(num_cat_col) == plot_row * plot_col, "num_cat_col的数量需与子图总数(6)一致" # 简化specs的生成方式,避免重复写字典 fig = make_subplots( rows=plot_row, cols=plot_col, specs=[[{'type':'box'}]*plot_col for _ in range(plot_row)] ) # 遍历每个列,计算对应的子图位置 for idx, col in enumerate(num_cat_col): # Plotly子图的行/列从1开始计数 row = (idx // plot_col) + 1 col_pos = (idx % plot_col) + 1 fig.add_trace(go.Box(x=df[col], y=df['Price']), row=row, col=col_pos) fig.show()
关键逻辑说明
- 用
enumerate获取每个列的索引idx,通过整数除法计算子图的行号,取余运算计算子图的列号,实现列与子图位置的一一对应 - 用列表推导式简化
specs的定义,避免重复编写相同的字典 - 添加断言检查列数与子图总数是否匹配,提前发现数据与布局不匹配的问题
内容的提问来源于stack exchange,提问作者sarah444
相关产品推荐
相关产品推荐

