【问题标题】:Fit straight line on semi-log scale with Matplotlib使用 Matplotlib 在半对数刻度上拟合直线
【发布时间】:2018-01-20 22:14:58
【问题描述】:

我一直在努力在用 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

我得到的图如下,拟合线是歪的。

非常感谢您的反馈和建议。

【问题讨论】:

  • 代码甚至没有尝试适应任何东西。您拟合数据的确切问题是什么?
  • 感谢您的回复。我没有添加我试图将直线拟合到该数据的代码,因为它是错误的。我希望有人能帮我弄清楚。
  • 是的,“帮助你弄清楚”并不意味着“为你编写代码”。因此,为了提供帮助,需要了解您的尝试。
  • 你说的很对,我很抱歉。我用以前的解决方案改变了我的问题。我还添加了输出图,这表明绿色虚线甚至没有接近原始数据。

标签: python python-3.x numpy matplotlib


【解决方案1】:

如果将数据的对数拟合成一条线,则在实际绘制拟合数据时需要反转此操作。 IE。如果你适合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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    相关资源
    最近更新 更多