如何在Python中绘制同X范围、不同数据量的曲线及其均值曲线
当然可以搞定!这种不同采样密度的数据集对比+均值曲线的需求,用Python结合pandas、matplotlib和scipy就能轻松实现。我给你整理了完整的步骤和代码示例,你可以直接套用:
核心思路
因为每个数据集的x值分布和点数不一样,直接计算均值会对应不上,所以我们需要:
- 生成一个统一的x轴网格(比如从0到4,取足够密集的点)
- 把每个数据集的y值插值到这个统一网格上,让所有数据集的x轴对齐
- 基于对齐后的y值计算均值曲线
- 把原始数据集和均值曲线一起可视化
完整代码示例
import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import interp1d # ---------------------- # 1. 模拟你的数据集(实际使用时替换成读取文件的代码) # ---------------------- np.random.seed(42) # 固定随机种子,保证结果可复现 # 数据集1:400个随机采样点 x1 = np.sort(np.random.uniform(0, 4, 400)) y1 = 2*x1 + np.random.normal(0, 0.5, 400) # 带噪声的线性趋势,模拟你的数据 dataset1 = pd.DataFrame({'x': x1, 'y': y1}) # 数据集2:600个随机采样点 x2 = np.sort(np.random.uniform(0, 4, 600)) y2 = 2*x2 + np.random.normal(0, 0.6, 600) dataset2 = pd.DataFrame({'x': x2, 'y': y2}) # 数据集3:500个随机采样点(可以扩展更多数据集) x3 = np.sort(np.random.uniform(0, 4, 500)) y3 = 2*x3 + np.random.normal(0, 0.4, 500) dataset3 = pd.DataFrame({'x': x3, 'y': y3}) # 把所有数据集和对应名称存到列表里,方便批量处理 datasets = [dataset1, dataset2, dataset3] dataset_labels = ['Dataset 1', 'Dataset 2', 'Dataset 3'] # ---------------------- # 2. 对齐x轴并计算均值曲线 # ---------------------- # 创建统一的x网格:从0到4,步长0.01,共401个点(可根据需求调整密度) common_x = np.linspace(0, 4, 401) # 对每个数据集进行插值,得到统一x上的y值 interpolated_y_list = [] for df in datasets: # 用线性插值(如果你的数据是非线性的,可以换成kind='cubic') # bounds_error=False + fill_value='extrapolate' 避免端点外的报错 interpolator = interp1d(df['x'], df['y'], kind='linear', bounds_error=False, fill_value='extrapolate') interpolated_y = interpolator(common_x) interpolated_y_list.append(interpolated_y) # 计算均值曲线:对每个x点的所有插值y值取平均 mean_y = np.mean(interpolated_y_list, axis=0) # ---------------------- # 3. 可视化 # ---------------------- plt.figure(figsize=(10, 6)) # 绘制每个原始数据集(用alpha=0.3让点半透明,避免重叠看不清) for df, label in zip(datasets, dataset_labels): plt.scatter(df['x'], df['y'], alpha=0.3, label=label) # 绘制均值曲线(加粗红色,突出显示) plt.plot(common_x, mean_y, color='#ff3333', linewidth=2.5, label='Mean Curve') # 设置图表细节 plt.xlabel('X Value', fontsize=12) plt.ylabel('Y Value', fontsize=12) plt.title('Comparison of Datasets with Mean Curve', fontsize=14) plt.xlim(0, 4) # 固定x轴范围和你的数据一致 plt.legend(fontsize=10) plt.grid(True, alpha=0.2) # 添加网格,提升可读性 plt.show()
实际使用注意事项
- 如果你的数据是从文件读取(比如CSV),把模拟数据的部分替换成
pd.read_csv('your_dataset.csv')即可,只要保证每个数据集有x和y列。 - 插值方法可以根据数据特性调整:比如数据是平滑曲线可以用
kind='cubic'(三次样条插值),如果是线性趋势用kind='linear'足够。 - 统一x网格的密度可以调整:比如把
np.linspace(0,4,401)改成np.linspace(0,4,801)会更密集,均值曲线更平滑。
内容的提问来源于stack exchange,提问作者ronald.udo.schmidt
相关产品推荐
相关产品推荐

