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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 20:04:56