matplotlib 我如何画一阶方程图?

tgabmvqs  于 2023-05-07  发布在  其他
关注(0)|答案(2)|浏览(149)

我想在Python中使用matplotlib绘制传感器值的线性方程图。
有A、B、C、D、STD的参数,我想绘制输出(y)与传感器值(x)的关系图。如果传感器值小于STD,则该参数为y=Ax+B;如果传感器值大于STD,则该参数为y=C(x-STD)+D。如下图所示,传感器值以1秒间隔输出的位置表示为red dot on the graph
我该怎么编码呢?
这是我目前为止的代码:

import matplotlib.pyplot as plt
import numpy as np
    
a = 0.1222
b = 66.268
c = 0.5200
d = 701.7080
STD = 5200

x = np.linspace(-10, 10, 1000)
y1 = a*x+b
y2 = c*(x*STD)+d
    
plt.plot(x, y1, label='y1=ax+b')
plt.plot(x, y2, label='y2=c(x*STD)+d')
    
plt.xlabel('x')
plt.ylabel('y')
plt.title('Graph of y1 and y2')
plt.legend()
    
plt.show()
wkftcu5l

wkftcu5l1#

你基本上有两个错误,所以你不能得到你想要的:

  • 你把x*STD而不是x-STD加入方程
  • 你有相同的限制,为两个图,所以你得到相交线,而不是一个单一的线组成的2段。此外,(-10, 10)限制没有多大意义,因此应该扩展它。

以下是如何绘制分段线的示例:

import matplotlib.pyplot as plt
import numpy as np

a = 0.1222
b = 66.268
c = 0.5200
d = 701.7080
STD = 5200
xmin = 0
xmax = 10000

x1 = np.linspace(xmin, STD, 1000)
x2 = np.linspace(STD, xmax, 1000)
y1 = a*x1 + b
y2 = c*(x2 - STD) + d

# both plots
plt.plot(x1, y1, label='ax + b')
plt.plot(x2, y2, label='c(x - STD) + d')

# arrow with STD
arrow_height = 1000
plt.arrow(STD, d + arrow_height, 5, -arrow_height, head_width=0.15*arrow_height, head_length=0.15*arrow_height, length_includes_head=True, fc='gray', ec='gray')
plt.text(STD, d + 1.05 * arrow_height, 'STD', color='gray', fontsize='large', ha='center', va='baseline')

plt.xlabel('x')
plt.ylabel('y')
plt.title('Graph of y1 and y2')
plt.legend()
    
plt.show()

你可以在上面再加一个红点,但原则应该是清楚的。

btxsgosb

btxsgosb2#

我使用了你在评论中提供的值。像这样更新代码将给予两条线,红点和水平线和垂直线,如示例所示。注意…在本例中,红点(x=1)在第二行,但代码应该处理这两种情况。希望这就是你要找的...

import matplotlib.pyplot as plt
import numpy as np
    
a = 27.363
b = 0.8187
c = 1.1051
d = 13.4
STD = 0.46

x = np.linspace(0, 30, 1000)

y1 = [i*a+b for i in x if i<= STD]  ## y1 is from start till x=STD
y2 = [i*c*STD+d for i in x if i>= STD]  ## y2 is from x=STD till the end

##Note x is filtered to show based on length
plt.plot(x[:len(y1)], y1, label='y1=ax+b')
plt.plot(x[-len(y2):], y2, label='y2=c(x*STD)+d')

## Common variable for the position of the dot and lines
if max(x[:len(y1)]) >= 1:
    pos=a+b
else:
    pos=c*STD+d
    
xmin=plt.xlim()[0]
ymin=plt.ylim()[0]
plt.scatter(1, pos, c='red', s = 100, zorder=5) ## The red dot
plt.hlines(y=pos, xmin=xmin, xmax=1, ls=":", color='black')  ##Horizontal line
plt.xlim(left=xmin)
plt.vlines(x=1, ymin=ymin, ymax=pos, ls=":", color='black')  ##Vertical line
plt.ylim(bottom=ymin)
    
plt.xlabel('x')
plt.ylabel('y')
plt.title('Graph of y1 and y2')
plt.legend()
    
plt.show()

相关问题