如何在Seaborn Countplot上正确叠加中位数垂直线?
解决Seaborn Countplot叠加中位数垂直线位置错误的问题
问题核心
Seaborn的countplot会把x轴解析为分类轴,每个类别对应从0开始的索引位置;而plt.axvline默认使用数值轴坐标。直接传入中位数的数值(比如4),会被当作数值轴的位置,和分类轴的索引不匹配,导致线条错位。
规范解决方法
方法1:通过分类索引定位中位数位置
先获取countplot的x轴分类标签,找到中位数对应的索引,再用这个索引绘制垂直线:
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd # 模拟数据(替换成你的df) df = pd.DataFrame({'Latest Rating': [1,2,3,4,4,4,5,5,3,2]}) fig, ax = plt.subplots(figsize=(9,6)) # 绘制countplot sns.countplot(x='Latest Rating', data=df, ax=ax) ax.set_title("Latest Rating distribution") # 计算中位数 median_val = df['Latest Rating'].median() # 获取x轴的分类标签并转成数值 x_labels = [float(tick.get_text()) for tick in ax.get_xticklabels()] # 找到中位数对应的索引 median_idx = x_labels.index(median_val) # 根据索引绘制垂直线 ax.axvline(x=median_idx, color='blue', ls='--', lw=2.5) plt.show()
方法2:将x轴转为数值刻度
如果评分是连续数值型,可以手动对齐x轴的刻度位置和实际评分值,让axvline直接用中位数数值定位:
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd df = pd.DataFrame({'Latest Rating': [1,2,3,4,4,4,5,5,3,2]}) fig, ax = plt.subplots(figsize=(9,6)) # 按排序后的唯一评分值绘制countplot rating_unique = sorted(df['Latest Rating'].unique()) sns.countplot(x='Latest Rating', data=df, ax=ax, order=rating_unique) ax.set_title("Latest Rating distribution") # 手动设置x轴刻度:索引对应实际评分值 ax.set_xticks(range(len(rating_unique))) ax.set_xticklabels(rating_unique) # 直接用中位数数值画垂直线 ax.axvline(x=df['Latest Rating'].median(), color='blue', ls='--', lw=2.5) plt.show()
为什么之前的代码无效
你之前先设置plt.xticks再绘制countplot,会被countplot的分类轴设置覆盖。countplot会自动生成分类刻度,覆盖手动设置的数值刻度,所以axvline还是会用错误的坐标体系。
内容的提问来源于stack exchange,提问作者Caio Andrade
相关产品推荐
相关产品推荐

