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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 04:50:03