【问题标题】:How to fit single polynomial curve to scatter plot如何将单个多项式曲线拟合到散点图
【发布时间】:2021-10-02 16:56:13
【问题描述】:
[from sklearn.mixture import GaussianMixture
from sklearn import preprocessing
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from scipy import stats
from astropy.io import ascii
from scipy.stats import norm
import math
from sklearn.metrics import r2_score

data2  = pd.read_csv("Dispersion total.csv")
names = data2.columns
df = pd.DataFrame(data2, columns=names)
df.head()


data3 = pd.read_csv("Dispersion less than equal to -1.5.csv")
names1 = data3.columns
df1 = pd.DataFrame(data3, columns=names1)
df1.head()

x= df1['Mean Mag'].values
y=df1['Log(sigma)'].values

#print(y)

w= df['Mean Mag'].values
z=df['Log(sigma)'].values


#ax=data2.plot(kind= 'scatter',x= 'Mean Mag',y = 'Log(sigma)',color='green')
#data3.plot(kind= 'scatter',x= 'Mean Mag',y = 'Log(sigma)',ax=ax)

fit = np.polyfit(x, y, 2)
a = fit[0]
b = fit[1]
c = fit[2]
fit_equation = a * np.square(x) + b * x + c
#Plotting
fig1 = plt.figure()
ax1 = fig1.subplots()
ax1.plot(x, fit_equation,color = 'r',alpha = 0.5, label = 'Polynomial fit')
ax1.scatter(w,z, s = 4, color = 'b', label = 'Data points')
ax1.set_title('Polynomial fit example')
ax1.legend()

plt.xlabel('Mean Magnitude')
plt.ylabel('Log(sigma)')
plt.show()

这是我目前拥有的情节:Current

我想要一个多项式拟合我的数据,它不会尝试拟合每个点,而是拟合最密集区域(-1.75 到 -1.5 之间)的一般曲线。像这样:

What I want it to look like

【问题讨论】:

    标签: python scatter-plot data-fitting


    【解决方案1】:

    您可以将拟合方程定义为 Python 函数。然后,您可以使用该函数为 x 值的密集数组计算模型 y 值,并将其传递给绘图方法:

    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    
    X_data = [1, 2, 3, 4, 5, 6]
    Y_data = [2, 4, 5, 6, 7, 5]
    
    a, b, c = np.polyfit(X_data, Y_data, 2)
    fit_equation = lambda x: a * x ** 2 + b * x + c
    
    def plot_fit(X, Y, f):
        X_fit = np.linspace(min(X), max(X), 1000)
        Y_fit = f(X_fit)
    
        fig, ax1 = plt.subplots()
        ax1.plot(X_fit, Y_fit, color='r', alpha=0.5, label='Polynomial fit')
        ax1.scatter(X, Y, s=4, color='b', label='Data points')
        ax1.set_title('Polynomial fit example')
        ax1.legend()
        plt.show()
        
    plot_fit(X_data, Y_data, fit_equation)
    

    增加多项式次数将导致更紧密的拟合:

    a, b, c, d, e = np.polyfit(X_data, Y_data, 4)
    fit_equation = lambda x: a * x**4 + b * x**3 + c * x**2 + d * x + e
        
    plot_fit(X_data, Y_data, fit_equation)
    

    因此,您可以选择使曲线保持在密集区域内的程度。在计算拟合之前去除异常值是另一种选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      • 2018-02-16
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多