使用pandas或numpy / scipy对matplotlib.pyplot进行平滑曲线

时间:2017-01-17 09:25:36

标签: python pandas numpy matplotlib scipy

我有一系列数据,包括来自几个实验的值(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?

1 个答案:

答案 0 :(得分: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)