如何在Matplotlib中实现X/Y轴间红蓝箭头以复现目标CDF图?
解决CDF图中红蓝箭头的绘制问题
你的代码核心问题在于随机生成的random_y并非对应random_x在CDF曲线上的实际累积概率值,且箭头样式使用了错误的HTML转义字符,导致无法复现目标效果。以下是修正后的代码:
import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import FancyArrowPatch # 生成正态分布随机数据 data = np.random.normal(0, 1, 100) sorted_data = np.sort(data) cdf = np.arange(1, len(sorted_data) + 1) / len(sorted_data) plt.figure(figsize=(8, 6)) plt.plot(sorted_data, cdf, label='经验CDF') # 随机选择x轴上的点,插值计算对应CDF值 random_x = np.random.choice(sorted_data, 1)[0] cdf_value = np.interp(random_x, sorted_data, cdf) # 绘制红色垂直箭头(从x轴到CDF曲线) arrow_red = FancyArrowPatch( (random_x, 0), (random_x, cdf_value), color='red', arrowstyle='->', mutation_scale=15, linewidth=1.5 ) plt.gca().add_patch(arrow_red) # 绘制蓝色水平箭头(从y轴到CDF曲线) arrow_blue = FancyArrowPatch( (0, cdf_value), (random_x, cdf_value), color='blue', arrowstyle='->', mutation_scale=15, linewidth=1.5 ) plt.gca().add_patch(arrow_blue) # 标注交点坐标 plt.annotate( f'({random_x:.2f}, {cdf_value:.2f})', (random_x + 0.1, cdf_value + 0.02), color='black' ) plt.title('带箭头的累积分布函数(CDF)') plt.xlabel('X轴') plt.ylabel('累积概率') plt.legend() plt.grid(True) plt.show()
关键修改说明
- 使用
np.interp()函数对random_x进行线性插值,得到其在CDF曲线上的对应累积概率值,确保箭头终点精准落在曲线上 - 将箭头样式中的
->替换为->,避免样式解析错误 - 添加
linewidth参数优化箭头线条粗细,贴近目标图视觉效果
内容的提问来源于stack exchange,提问作者bunus19
相关产品推荐
相关产品推荐

