如何将两个多列Pandas DataFrame绘入单个箱线图?遇AssertionError:1
解决连续调用Pandas boxplot触发AssertionError的问题
错误原因
你遇到的AssertionError:1来自Pandas箱线图内部的分组逻辑检查:当在同一个Axes上绘制多组数据时,数据列数与分组划分的余数不为0,触发断言失败。你的代码中两次调用df.boxplot()时未明确指定目标Axes,导致Pandas内部处理分组时出现冲突。
解决方案
核心是复用同一个Axes对象绘制两个DataFrame的箱线图,明确指定ax参数,避免全局绘图状态的混乱。
修正后的代码
match index: case 0: fig, ax = plt.subplots() # 指定绘制到创建好的ax上 df.boxplot(ax=ax) case 1: # 复用同一个ax绘制第二个DataFrame的箱线图 df.boxplot(ax=ax) min_y = min_y_8h - 0.25 * abs(min_y_8h) max_y = max_y_8h + 1.25 * abs(max_y_8h) x_ticks = ax.get_xticks() x_labels = [str(int(tick)) for tick in x_ticks if int(tick) % 3 == 0] # 筛选有效刻度的索引 valid_indices = [i for i, tick in enumerate(x_ticks) if int(tick) % 3 == 0] ax.set_xticks([x_ticks[i] for i in valid_indices]) ax.set_xticklabels(x_labels, rotation=45) ax.set_xlim(2.5, 23.5) ax.set_ylim(min_y, max_y) plt.show() plt.close()
额外注意事项
- 如果两个DataFrame的列数不同,建议先对齐列(比如用
pd.concat合并时补充缺失列为NaN),或者通过boxplot的positions参数手动指定每个箱线图的x轴位置,避免重叠或索引错乱。 - 优先使用Axes对象的方法(如
ax.get_xticks()、ax.set_xticks())代替Matplotlib的全局绘图函数,减少全局状态冲突的概率。
内容的提问来源于stack exchange,提问作者Cheehee
相关产品推荐
相关产品推荐

