在Matplotlib上使用半对数坐标系拟合直线

4

我一直在尝试使用Matplotlib和Python 3在半对数坐标轴上拟合一条直线,但一直没能成功。我看过很多示例有关对数-对数比例图的内容,但我尝试过的解决方案都没有奏效(使用numpy)。 绘制的直线总会出现扭曲。

以下是我目前所拥有的内容:

import os
import matplotlib
import matplotlib.pyplot as plt
import numpy as np

base_path = os.path.dirname(os.path.realpath(__file__))

fig = plt.figure()
ax = fig.add_subplot(111)

# Plot data.
location = os.path.join(base_path, "data.csv")
data = np.genfromtxt(location, delimiter=',', names=['year', 'bw'])
ax.plot(data['year'], data['bw'])

# Fit test.
x = data['year']
y = data['bw']
y_ln = np.log10(y)

n = data.shape[0]
A = np.array(([[x[j], 1] for j in range(n)]))
B = np.array(y_ln[0:n])
B = np.array(y[0:n])

X = np.linalg.lstsq(A, B)[0]
a = X[0]
b = X[1]

fit = a * x + b

p = np.polyfit(x, np.log(y), 1)
ax.semilogy(x, p[0] * x + p[1], 'g--')

ax.set_yscale('log')

相关的data.csv文件如下所示:
2016, 68.41987090116676
2017, 88.9788618486191
2018, 90.94850458504749
2019, 113.20946182004333
2020, 115.71547492850719

我得到的图形如下所示,拟合直线是弯曲的。 半对数图与本应为一条直线的拟合线 非常感谢反馈和建议。

1
代码甚至没有尝试去适配任何东西。你在适配数据方面遇到了什么确切的问题? - ImportanceOfBeingErnest
谢谢您的回复。我没有添加我尝试拟合这些数据的代码,因为它是错误的。我希望有人能帮助我弄清楚。 - user7426532
1
是的,“帮你弄清楚”并不意味着“为你编写那段代码”。因此,为了提供帮助,我们需要看到你的尝试。 - ImportanceOfBeingErnest
非常正确,我道歉。我改变了我的问题,并提供了我之前的解决方案。我还添加了输出图,显示绿色虚线与原始数据根本不接近。 - user7426532
1个回答

3

如果您将数据的对数拟合成一条直线,那么在实际绘制拟合数据时需要反转这个操作。例如,如果您将一条直线拟合到np.log(y),那么您需要绘制np.exp(fit_result)

# Fit test.
x = data['year']
y = data['bw']

p = np.polyfit(x, np.log(y), 1)
ax.semilogy(x, np.exp(p[0] * x + p[1]), 'g--')

完整示例:

import io
import matplotlib.pyplot as plt
import numpy as np

u = u"""2016, 68.41987090116676
2017, 88.9788618486191
2018, 90.94850458504749
2019, 113.20946182004333
2020, 115.71547492850719"""

data = np.genfromtxt(io.StringIO(u), delimiter=',', names=['year', 'bw'])

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(data['year'], data['bw'])

# Fit test.
x = data['year']
y = data['bw']

p = np.polyfit(x, np.log(y), 1)
ax.semilogy(x, np.exp(p[0] * x + p[1]), 'g--')

ax.set_yscale('log')

plt.show()

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接