如何从seaborn的kdeplot获取y值,让垂直线精准触达密度曲线?
问题分析与解决
你遇到的问题核心是**plt.axvline的ymax参数是相对坐标轴的比例值(范围0-1),而非密度曲线的实际y值**。直接用插值得到的f(密度曲线的实际y值)作为ymax,会因为该值远小于1,导致垂直线只画到坐标轴比例对应的位置,而不是曲线的实际高度。
另外你的代码里重复调用了sns.kdeplot(a),这会在图上绘制两条重叠的密度曲线,属于冗余操作。
修正后的代码
import numpy as np import seaborn as sns import matplotlib.pyplot as plt np.random.seed(1) a = np.random.normal(size=1000) # 只调用一次kdeplot,保存绘图轴对象 ax = sns.kdeplot(a) x, y = ax.get_lines()[0].get_data() # 插值得到x=1对应的密度值f f = np.interp(1, x, y) # 获取当前y轴的上限,将f转换为相对比例 y_max_ax = ax.get_ylim()[1] ymax_ratio = f / y_max_ax # 绘制垂直线,使用相对比例作为ymax plt.axvline(x=1, ymax=ymax_ratio, color='r') plt.show()
关键说明
- 避免重复调用
sns.kdeplot:第一次调用时把返回的轴对象存为ax,后续直接用这个对象获取数据,不会重复绘图。 - 转换y值为相对比例:
ax.get_ylim()[1]获取当前y轴的最大值,用实际密度值f除以这个最大值,得到相对于坐标轴的比例,这样axvline就能精准延伸到曲线对应的位置。
内容的提问来源于stack exchange,提问作者Oalvinegro
相关产品推荐
相关产品推荐

