使用plt.axvline绘制竖线时如何使其止于累积直方图曲线交点?
解决plt.axvline绘制竖线止于累积曲线交点的问题
plt.axvline 默认的 ymin=0 和 ymax=1 对应坐标轴的整个高度范围,而非累积曲线的实际y值范围,所以会超出交点。要让它准确停止,核心是先计算指定x对应的累积概率值,再将该值转换为坐标轴的比例坐标,赋值给 ymax。
具体实现步骤及代码
import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import interp1d # 1. 生成示例数据并计算累积分布 data = np.random.normal(loc=0, scale=1, size=1000) counts, bins = np.histogram(data, bins=30, density=True) cumulative = np.cumsum(counts * np.diff(bins)) bins_center = (bins[:-1] + bins[1:]) / 2 # 取bin中点作为累积曲线的x坐标 # 2. 指定目标x值,计算对应的累积概率y值 target_x = 0.5 # 插值处理离散bins,确保非bin点的y值准确 cumulative_interp = interp1d(bins_center, cumulative, kind='linear', fill_value='extrapolate') target_y = cumulative_interp(target_x) # 3. 绘制累积曲线 plt.plot(bins_center, cumulative, label='累积分布') # 4. 将实际y值转换为坐标轴比例(axvline的ymin/ymax接受0-1的比例值) ax = plt.gca() y_axis_min, y_axis_max = ax.get_ylim() target_y_norm = (target_y - y_axis_min) / (y_axis_max - y_axis_min) # 5. 用axvline绘制精准止于交点的竖线 plt.axvline(x=target_x, ymin=0, ymax=target_y_norm, color='r', linestyle='--', label='axvline交点竖线') # 绘图美化 plt.xlabel('X值') plt.ylabel('累积概率') plt.legend() plt.show()
关键细节说明
- 用
interp1d插值:处理指定x不在bins中点的情况,保证y值的准确性; - 坐标转换:
ax.get_ylim()获取当前y轴范围,将实际数据y值转换为0-1的轴比例,这是axvline能识别的参数格式; - 手动设置
ymin=0和ymax=target_y_norm:让竖线从坐标轴底部延伸到累积曲线的交点位置,避免超出。
内容的提问来源于stack exchange,提问作者Wizard
相关产品推荐
相关产品推荐

