【问题标题】:Smoothing curve for matplotlib.pyplot using pandas or numpy/scipy使用 pandas 或 numpy/scipy 的 matplotlib.pyplot 平滑曲线
【发布时间】:2017-06-01 06:59:41
【问题描述】:

我有一系列数据,其中包含来自多个实验的值(1-40,在 MWE 中为 1-5)。我的原始数据中的条目总数约为 4.000.000,我尝试对其进行平滑以显示它:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import spline
from statsmodels.nonparametric.smoothers_lowess import lowess

df = pd.DataFrame()
df["values"] = np.random.randint(100000, 200000, 1000)
df["id"] = [1,2,3,4,5] * 200
plt.figure(1, figsize=(11.69,8.27))
# Both fail for my amount of data:
plt.plot(spline(df["values"], df["id"], range(100)), "r-")
plt.plot(lowess(df["values"], df["id"]), "r-")

scipy.interplate 和 statsmodels.nonparametric.smoothers_lowess.lowess 都会为我的数据抛出内存不足异常。是否有任何有效的方法来解决这个问题,例如使用 ggplot2 和 geom_smooth() 的 GNU R?

【问题讨论】:

  • 你为什么在第一个情节中使用range(100)?在那个地方是一个 int。
  • 根据文档 (docs.scipy.org/doc/scipy-0.18.1/reference/generated/…),它是一个新 x 值的列表/数组,在这种情况下是 [0, 2, ..., 99],对吧?
  • 将平滑计算与绘图调用分开,这样您就可以看到它失败的地方。我的猜测是,用 400 万个点创建一个图信息量不是很大,并且可能需要大量内存。同样对于lowess,当样本量很大时,应该减少用于局部回归的分数。
  • 一个无信息的绘图是我想从绘制所有值更改为平滑的原因。它无法创建平滑计算。

标签: python pandas numpy matplotlib scipy


【解决方案1】:

我无法完全说出您对数据的所有维度的了解,但您可以尝试的一件非常简单的事情是像这样使用“markevery”kwarg:

import numpy as np
import matplotlib.pyplot as plt

x=np.linspace(1,100,1E7)
y=x**2
plt.figure(1, figsize=(11.69,8.27))
plt.plot(x,y,markevery=100)
plt.show()

这只会绘制每第 n 个点(这里 n=100)。

如果这没有帮助,那么您可能只想尝试一个简单的 numpy 插值,样本较少,如下所示:

x_large=np.linspace(1,100,1E7)
y_large=x**2
x_small=np.linspace(1,100,1E3)
y_small=np.interp(x_small,x_large,y_large)
plt.plot(x_small,y_small)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-16
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    相关资源
    最近更新 更多