Python绘制距离数据分布图的正确实现方法(现有代码问题排查)
原有代码错误说明
- 取数错误:
z = A[0]只读取了文件中第一个距离值,基于单个值计算直方图自然无法得到正确分布,应该直接使用读取到的全部数据A - 切片逻辑错误:计算bin中心和宽度时使用
edges[:1](仅取edges数组第一个元素),正确写法为edges[:-1](取edges数组除最后一个元素外的所有值),否则数组长度不匹配会触发广播错误 - bin数量不合理:总共有26条数据,设置100个bins会导致绝大多数bin为空,无法体现真实分布特征
- 冗余导入:代码中导入的
spline、scipy.stats等模块未实际使用,可以删除
可直接运行的正确代码
import numpy as np import matplotlib.pyplot as plt # 读取全部距离数据 A = np.loadtxt('abc.txt') # 计算直方图,设置适配数据量的bin数量 hist, edges = np.histogram(A, bins=8) # 计算每个bin的中心点 bin_centers = (edges[:-1] + edges[1:]) / 2 # 计算每个bin的宽度 bin_widths = edges[1:] - edges[:-1] # 绘制直方图 plt.bar(bin_centers, hist, width=bin_widths, edgecolor='black', alpha=0.7) # 绘制分布趋势线 plt.plot(bin_centers, hist, 'r-o', linewidth=2) # 设置坐标轴标签 plt.xlabel('距离') plt.ylabel('频次') # 添加网格辅助读数 plt.grid(axis='y', alpha=0.3) plt.show()
如果需要绘制带核密度估计的平滑分布曲线,可使用如下扩展代码:
import numpy as np import matplotlib.pyplot as plt from scipy.stats import gaussian_kde A = np.loadtxt('abc.txt') # 创建画布和双坐标轴 fig, ax1 = plt.subplots() # 绘制频次直方图 ax1.hist(A, bins=8, edgecolor='black', alpha=0.7) ax1.set_xlabel('距离') ax1.set_ylabel('频次', color='tab:blue') ax1.tick_params(axis='y', labelcolor='tab:blue') # 绘制核密度估计曲线 ax2 = ax1.twinx() kde = gaussian_kde(A) x_range = np.linspace(A.min(), A.max(), 100) density = kde(x_range) ax2.plot(x_range, density, 'r-', linewidth=2) ax2.set_ylabel('密度', color='tab:red') ax2.tick_params(axis='y', labelcolor='tab:red') plt.title('距离数据分布') plt.show()
内容的提问来源于stack exchange,提问作者Dilip.H.N
相关产品推荐
相关产品推荐

