如何解决用对数刻度很难在散点图上绘制线性回归线
我有一个这样的示例数据框:
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'],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] 转换为 log,我可以获得正确的线性趋势,但我想用最后一个绘图的值显示 y 轴,而不是作为转换后的对数值下面这个:
df['b_log'] = np.log10(df['b'])
coefs = np.polyfit(df['a'],df['b_log'],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")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。