虽然交叉表能提供两个分类变量间类别组合的精确数值计数,但可视化通常能使模式和关联更直接地显现。条形图是可视化分类数据的标准工具,在处理两个分类变量时,我们通常使用分组条形图或堆叠条形图。这些图表有助于我们比较不同类别组合的频率或比例。分组条形图分组条形图将代表一个分类变量计数(或比例)的条形并排排列,并根据第二个变量的类别进行分组。当您想直接比较一个变量在另一个变量不同级别上的计数时,这种格式尤为适用。考虑一个船上乘客的数据集,其中包含生存状态(Survived:是/否)与乘客等级(Pclass:一等/二等/三等)两个变量。分组条形图是一种有效的方式,可以为每个乘客等级并排显示“是”和“否”的生存情况的条形。这种可视化方法使得可以轻易看出,例如,一等舱幸存者的绝对数量是高于还是低于一等舱非幸存者的数量,以及这种比较在二等舱和三等舱中如何变化。让我们看看如何使用Seaborn创建它。假设您有一个包含CategoryA和CategoryB列的Pandas DataFrame df:import seaborn as sns import matplotlib.pyplot as plt import pandas as pd # 示例数据(请替换为您的实际数据) data = {'CategoryA': ['X', 'Y', 'X', 'Y', 'X', 'Y', 'X', 'X', 'Y', 'Y'], 'CategoryB': ['A', 'A', 'B', 'B', 'A', 'B', 'B', 'A', 'A', 'B']} df = pd.DataFrame(data) # 创建分组条形图 plt.figure(figsize=(8, 5)) # 可选:调整图表大小 sns.countplot(data=df, x='CategoryA', hue='CategoryB', palette=['#4dabf7', '#ff922b']) # 添加标签和标题以增强清晰度 plt.xlabel("类别 A") plt.ylabel("计数") plt.title("类别 A 中类别 B 的计数(分组)") plt.legend(title='类别 B') plt.tight_layout() # 调整布局 plt.show()此代码使用Seaborn的countplot函数。通过指定x='CategoryA'和hue='CategoryB',Seaborn会自动计算每个组合的计数,并将其绘制为分组条形图。hue参数在这里很重要;它告知Seaborn应使用哪个变量来对每个x类别中的条形进行分组。{"layout": {"title": "类别 A 中类别 B 的计数(分组)", "xaxis": {"title": "类别 A"}, "yaxis": {"title": "计数"}, "barmode": "group", "legend": {"title": {"text": "类别 B"}}, "autosize": true, "height": 400}, "data": [{"type": "bar", "name": "A", "x": ["X", "Y"], "y": [3, 2], "marker": {"color": "#4dabf7"}}, {"type": "bar", "name": "B", "x": ["X", "Y"], "y": [2, 3], "marker": {"color": "#ff922b"}}]}分组条形图比较了类别 A('X','Y')的每个级别中类别 B('A','B')的计数。堆叠条形图堆叠条形图也表示两个分类变量之间组合的计数,但它不是将条形并排放置,而是将代表第二个变量类别的条形堆叠在第一个变量的每个条形之上。每个堆叠条形的总高度代表主变量(x轴上的变量)该类别的总计数。堆叠图对于了解第二个变量在第一个变量的每个类别中的构成或比例非常出色。使用我们的船上乘客示例,一个将Pclass放在x轴上的堆叠条形图将显示一等、二等和三等舱的单个条形。每个条形将按颜色划分,显示该舱内幸存者(“是”)和非幸存者(“否”)的比例。这使得可以方便地目视比较不同舱位的生存率。您可以在创建交叉表后使用Pandas的绘图功能,或直接使用Seaborn的histplot(它也可以处理分类数据的计数)并使用multiple='stack'参数来创建堆叠条形图。使用Pandas和Matplotlib在创建交叉表后进行绘制:import pandas as pd import matplotlib.pyplot as plt # 假设 'df' 是包含 'CategoryA' 和 'CategoryB' 的 DataFrame # 1. 创建交叉表 cross_tab = pd.crosstab(df['CategoryA'], df['CategoryB']) # 2. 绘制堆叠条形图 ax = cross_tab.plot(kind='bar', stacked=True, figsize=(8, 5), color=['#4dabf7', '#ff922b']) # 添加标签和标题 plt.xlabel("类别 A") plt.ylabel("计数") plt.title("类别 A 中类别 B 的构成(堆叠)") plt.xticks(rotation=0) # 保持 x 轴标签水平 plt.legend(title='类别 B') plt.tight_layout() plt.show()Image 20 或者,使用Seaborn的histplot:import seaborn as sns import matplotlib.pyplot as plt # 使用 histplot 进行堆叠 plt.figure(figsize=(8, 5)) sns.histplot(data=df, x='CategoryA', hue='CategoryB', multiple='stack', palette=['#4dabf7', '#ff922b'], shrink=0.8) # shrink 参数在条形之间添加间隙 plt.xlabel("类别 A") plt.ylabel("计数") plt.title("类别 A 中类别 B 的构成(堆叠)") plt.tight_layout() plt.show()Image 21 有时,如果将条形标准化以代表100%,则比较比例会更容易。这通常被称为“填充”堆叠条形图。# 从交叉表计算比例 cross_tab_prop = cross_tab.apply(lambda x: x / x.sum() * 100, axis=1) # 绘制 100% 堆叠条形图 ax = cross_tab_prop.plot(kind='bar', stacked=True, figsize=(8, 5), color=['#4dabf7', '#ff922b']) plt.xlabel("类别 A") plt.ylabel("百分比 (%)") plt.title("类别 A 中类别 B 的比例构成(100% 堆叠)") plt.xticks(rotation=0) plt.legend(title='类别 B', loc='center left', bbox_to_anchor=(1, 0.5)) # 将图例移到外部 plt.tight_layout() plt.show(){"layout": {"title": "类别 A 中类别 B 的比例构成(100% 堆叠)", "xaxis": {"title": "类别 A"}, "yaxis": {"title": "百分比 (%)"}, "barmode": "stack", "legend": {"title": {"text": "类别 B"}}, "autosize": true, "height": 400}, "data": [{"type": "bar", "name": "A", "x": ["X", "Y"], "y": [60.0, 40.0], "marker": {"color": "#4dabf7"}}, {"type": "bar", "name": "B", "x": ["X", "Y"], "y": [40.0, 60.0], "marker": {"color": "#ff922b"}}]}一个100%堆叠条形图,显示了类别 A('X','Y')的每个级别中类别 B('A','B')的百分比分布。选择合适的图表当您的主要目的是比较第二个变量在第一个变量的不同类别中的绝对计数时,请使用分组条形图。例如,比较男性幸存者与女性幸存者的原始数量。当您的主要目的是了解和比较第二个变量在第一个变量的每个类别中的比例构成时,请使用堆叠条形图(特别是100%版本)。例如,比较男性和女性之间的生存率(百分比)。这两种图表都是您探索性数据分析工具集中有益的补充,它们提供对分类数据中隐藏关联的视觉理解,补充了从交叉表获得的数值汇总。请记住,始终清晰地标注坐标轴,并在需要时提供图例以方便解读。