难以在具有对数刻度的散点图上绘制线性回归线
Difficult to plot linear regression line on scatter plot with log scale
我有一个这样的示例数据框:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame({'a':[0.05, 0.11, 0.18, 0.20, 0.22, 0.27],
'b':[3.14, 1.56, 33.10, 430.00, 239.10, 2600.22]})
我想将这些属性绘制成散点图,然后显示这些样本的线性趋势线。我需要将数据放在对数刻度的 y 轴 (df['b']) 上。
虽然,当我尝试借助 np.polyfit
执行此操作时,我得到了一条奇怪的线。
# Coefficients for polynomial function (degree 1)
coefs = np.polyfit(df['a'], df['b'], 1)
fit_coefs = np.poly1d(coefs)
plt.figure()
plt.scatter(df['a'], df['b'], s = 50, edgecolors = 'black')
plt.plot(df['a'], fit_coefs(df['a']), color='red',linestyle='--')
plt.xlabel('a')
plt.ylabel('b')
plt.yscale('log')
如果我在绘图前将 df['b] 转换为对数,我可以获得正确的线性趋势,但我想用最后一个绘图的值而不是转换后的对数显示 y 轴值如下:
df['b_log'] = np.log10(df['b'])
coefs = np.polyfit(df['a'], df['b_log'], 1)
fit_coefs = np.poly1d(coefs)
plt.figure()
plt.scatter(df['a'], df['b_log'], s = 50, edgecolors = 'black')
plt.plot(df['a'], fit_coefs(df['a']), color='red', linestyle='--')
plt.xlabel('a')
plt.ylabel('b_log')
所以基本上,我需要一个像上一个那样的图,但 y 轴上的值应该像第二个图一样,我仍然会得到正确的线性趋势。谁能帮帮我?
你在那里做了两件不同的事情:首先,你正在为你的指数数据拟合一条线性曲线(这可能不是你想要的),然后你正在为你的对数数据拟合一条线性曲线,这没关系.
为了从对数图中的线性系数得到线性曲线,你可以只做10**fit_coefs(df['a'])
:
df['b_log'] = np.log10(df['b'])
coefs = np.polyfit(df['a'], df['b_log'], 1)
fit_coefs = np.poly1d(coefs)
plt.figure()
plt.scatter(df['a'], df['b'], s = 50, edgecolors = 'black')
plt.plot(df['a'], 10**fit_coefs(df['a']), color='red', linestyle='--')
plt.xlabel('a')
plt.ylabel('b_log')
plt.yscale("log")
我有一个这样的示例数据框:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame({'a':[0.05, 0.11, 0.18, 0.20, 0.22, 0.27],
'b':[3.14, 1.56, 33.10, 430.00, 239.10, 2600.22]})
我想将这些属性绘制成散点图,然后显示这些样本的线性趋势线。我需要将数据放在对数刻度的 y 轴 (df['b']) 上。
虽然,当我尝试借助 np.polyfit
执行此操作时,我得到了一条奇怪的线。
# Coefficients for polynomial function (degree 1)
coefs = np.polyfit(df['a'], df['b'], 1)
fit_coefs = np.poly1d(coefs)
plt.figure()
plt.scatter(df['a'], df['b'], s = 50, edgecolors = 'black')
plt.plot(df['a'], fit_coefs(df['a']), color='red',linestyle='--')
plt.xlabel('a')
plt.ylabel('b')
plt.yscale('log')
如果我在绘图前将 df['b] 转换为对数,我可以获得正确的线性趋势,但我想用最后一个绘图的值而不是转换后的对数显示 y 轴值如下:
df['b_log'] = np.log10(df['b'])
coefs = np.polyfit(df['a'], df['b_log'], 1)
fit_coefs = np.poly1d(coefs)
plt.figure()
plt.scatter(df['a'], df['b_log'], s = 50, edgecolors = 'black')
plt.plot(df['a'], fit_coefs(df['a']), color='red', linestyle='--')
plt.xlabel('a')
plt.ylabel('b_log')
所以基本上,我需要一个像上一个那样的图,但 y 轴上的值应该像第二个图一样,我仍然会得到正确的线性趋势。谁能帮帮我?
你在那里做了两件不同的事情:首先,你正在为你的指数数据拟合一条线性曲线(这可能不是你想要的),然后你正在为你的对数数据拟合一条线性曲线,这没关系.
为了从对数图中的线性系数得到线性曲线,你可以只做10**fit_coefs(df['a'])
:
df['b_log'] = np.log10(df['b'])
coefs = np.polyfit(df['a'], df['b_log'], 1)
fit_coefs = np.poly1d(coefs)
plt.figure()
plt.scatter(df['a'], df['b'], s = 50, edgecolors = 'black')
plt.plot(df['a'], 10**fit_coefs(df['a']), color='red', linestyle='--')
plt.xlabel('a')
plt.ylabel('b_log')
plt.yscale("log")