You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何用seaborn调整列顺序并并排绘制选择题答案统计图

核心报错原因说明

你之前混用plt.subplot和sns.catplot报错,是因为sns.catplot属于Seaborn的图级接口,本身会自动创建独立的画布体系,不能嵌套进plt.subplot生成的子图容器中,我们可以用两种方案实现需求:


方案1:用plt.subplots + 轴级接口sns.countplot自定义布局

这种方式灵活度更高,适合自由控制子图的排布位置:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 1. 读取本地数据集(提前把下载的数据集存到本地,替换下面的路径)
df = pd.read_csv("你的本地文件路径.csv")

# 2. 数据集格式转换:把原宽表转为[试卷代码, 答案]的长表,方便后续分组绘图
df_long = df.melt(var_name="试卷代码", value_name="答案")

# 3. 筛选需要展示的试卷,比如这里选code0和code1两套
df_show = df_long[df_long["试卷代码"].isin(["code0", "code1"])]

# 4. 创建1行2列的子图画布,sharey参数让两侧Y轴刻度一致,方便对比
fig, axes = plt.subplots(1, 2, figsize=(12, 5), sharey=True)

# 5. 分别给两个子图绘图,order参数固定选项顺序为A/B/C/D
sns.countplot(
    x="答案", 
    data=df_show[df_show["试卷代码"] == "code0"], 
    order=["A", "B", "C", "D"],
    ax=axes[0]
)
axes[0].set_title("试卷code0答案分布")
axes[0].set_xlabel("选项")
axes[0].set_ylabel("出现次数")

sns.countplot(
    x="答案", 
    data=df_show[df_show["试卷代码"] == "code1"], 
    order=["A", "B", "C", "D"],
    ax=axes[1]
)
axes[1].set_title("试卷code1答案分布")
axes[1].set_xlabel("选项")

# 自动调整布局避免标签重叠
plt.tight_layout()
plt.show()

方案2:直接用sns.catplot的col参数生成分栏图

如果需要批量展示多套试卷的分布,直接用catplot自带的分栏参数更简单,不需要手动创建子图:

# 承接上面已经处理好的df_show数据
sns.catplot(
    x="答案",
    data=df_show,
    kind="count",
    order=["A", "B", "C", "D"],
    col="试卷代码", # 按试卷代码拆分列
    height=4,
    aspect=0.9
)
plt.show()

# 如果要展示全部24套试卷,可以调整col_wrap参数控制每行放几张,比如每行放4张:
sns.catplot(
    x="答案",
    data=df_long,
    kind="count",
    order=["A", "B", "C", "D"],
    col="试卷代码",
    col_wrap=4,
    height=2.5,
    aspect=0.8
)
plt.show()

内容的提问来源于stack exchange,提问作者user15515518

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:36:04