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
相关产品推荐
相关产品推荐

