如何在 matplotlib 中扩展线性回归图
How do I extend a linear regression plot in matplotlib
我在尝试将绘图的直线部分拟合为线性部分时遇到了问题。
为了完成我的绘图,我必须延长红线,就好像它是一条直线一样,以便可以观察到它与至少 x 轴的交点。
我的代码是:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
#data = pd.read_csv("LPPII_cw_2_1.csv")
#f = data["f [kHz]"]
f = (1, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 500)
#h21e = data["h21e [A/A]"]
h21e = (218., 215., 210., 200., 189., 175., 165., 150., 140., 129., 120., 69., 30.)
linearf = f[-3:]
linearh = h21e[-3:]
logA = np.log(linearf)
logB = np.log(linearh)
m, c = np.polyfit(logA, logB, 1, w=np.sqrt(linearh))
y_fit = np.exp(m*logA + c)
fig, ax = plt.subplots()
ax.set_xscale('log')
ax.set_yscale('log')
ax.set_xlabel('f [kHz]')
ax.set_ylabel('h$_{21e}$ [A/A]')
ax.scatter(f, h21e, marker='.', color='k')
ax.plot(linearf, y_fit, color='r', linestyle='-')
plt.show()
我的情节是这样的:
您可以添加 x 轴的最大值并将其附加在 linearf
的末尾。然后计算曲线,并画出它。需要保存并重置旧的 y 限制,以防止 matplotlib 自动扩展这些限制。请注意,只有在绘制散点图后才能提取 x-lims。
import matplotlib.pyplot as plt
import numpy as np
f = (1, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 500)
h21e = (218., 215., 210., 200., 189., 175., 165., 150., 140., 129., 120., 69., 30.)
linearf = f[-3:]
linearh = h21e[-3:]
logA = np.log(linearf)
logB = np.log(linearh)
m, c = np.polyfit(logA, logB, 1, w=np.sqrt(linearh))
fig, ax = plt.subplots()
ax.set_xscale('log')
ax.set_yscale('log')
ax.set_xlabel('f [kHz]')
ax.set_ylabel('h$_{21e}$ [A/A]')
ax.scatter(f, h21e, marker='.', color='k')
linearf_ext = list(linearf) + [ax.get_xlim()[1]]
logA = np.log(linearf_ext)
y_fit = np.exp(m * logA + c)
ymin, ymax = ax.get_ylim()
ax.plot(linearf_ext, y_fit, color='r', linestyle='-')
ax.set_ylim(ymin, ymax)
plt.tight_layout()
plt.show()
我在尝试将绘图的直线部分拟合为线性部分时遇到了问题。 为了完成我的绘图,我必须延长红线,就好像它是一条直线一样,以便可以观察到它与至少 x 轴的交点。
我的代码是:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
#data = pd.read_csv("LPPII_cw_2_1.csv")
#f = data["f [kHz]"]
f = (1, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 500)
#h21e = data["h21e [A/A]"]
h21e = (218., 215., 210., 200., 189., 175., 165., 150., 140., 129., 120., 69., 30.)
linearf = f[-3:]
linearh = h21e[-3:]
logA = np.log(linearf)
logB = np.log(linearh)
m, c = np.polyfit(logA, logB, 1, w=np.sqrt(linearh))
y_fit = np.exp(m*logA + c)
fig, ax = plt.subplots()
ax.set_xscale('log')
ax.set_yscale('log')
ax.set_xlabel('f [kHz]')
ax.set_ylabel('h$_{21e}$ [A/A]')
ax.scatter(f, h21e, marker='.', color='k')
ax.plot(linearf, y_fit, color='r', linestyle='-')
plt.show()
我的情节是这样的:
您可以添加 x 轴的最大值并将其附加在 linearf
的末尾。然后计算曲线,并画出它。需要保存并重置旧的 y 限制,以防止 matplotlib 自动扩展这些限制。请注意,只有在绘制散点图后才能提取 x-lims。
import matplotlib.pyplot as plt
import numpy as np
f = (1, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 500)
h21e = (218., 215., 210., 200., 189., 175., 165., 150., 140., 129., 120., 69., 30.)
linearf = f[-3:]
linearh = h21e[-3:]
logA = np.log(linearf)
logB = np.log(linearh)
m, c = np.polyfit(logA, logB, 1, w=np.sqrt(linearh))
fig, ax = plt.subplots()
ax.set_xscale('log')
ax.set_yscale('log')
ax.set_xlabel('f [kHz]')
ax.set_ylabel('h$_{21e}$ [A/A]')
ax.scatter(f, h21e, marker='.', color='k')
linearf_ext = list(linearf) + [ax.get_xlim()[1]]
logA = np.log(linearf_ext)
y_fit = np.exp(m * logA + c)
ymin, ymax = ax.get_ylim()
ax.plot(linearf_ext, y_fit, color='r', linestyle='-')
ax.set_ylim(ymin, ymax)
plt.tight_layout()
plt.show()