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

如何在Python中绘制同X范围、不同数据量的曲线及其均值曲线

当然可以搞定!这种不同采样密度的数据集对比+均值曲线的需求,用Python结合pandas、matplotlib和scipy就能轻松实现。我给你整理了完整的步骤和代码示例,你可以直接套用:

核心思路

因为每个数据集的x值分布和点数不一样,直接计算均值会对应不上,所以我们需要:

  1. 生成一个统一的x轴网格(比如从0到4,取足够密集的点)
  2. 把每个数据集的y值插值到这个统一网格上,让所有数据集的x轴对齐
  3. 基于对齐后的y值计算均值曲线
  4. 把原始数据集和均值曲线一起可视化

完整代码示例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:12:36