如果斜率大于某个阈值,则将 python 中的线涂成红色

if slope is greater than some threshold, then color the line red in python

我在 python 中绘制了一个折线图。我需要做的最后一件事是添加一条线,告诉它在斜率大于 25 时将图表的一部分着色为红色。我该怎么做?

这是我目前的情况。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

data = pd.read_csv('ReactorStartupTemps.csv')
print(data)

plt.rcParams["figure.figsize"] = [5, 4]
plt.rcParams["figure.autolayout"] = True
plt.xlabel('Time [min]', fontdict={'fontname': 'Times New Roman', 
'style': 'italic'})
plt.ylabel('Temperature [C]', fontdict={'fontname': 'Times New Roman', 
'style': 'italic'})
plt.title('Reactor Startup Temperatures', fontdict={'fontname': 'Times 
New Roman', 'style': 'italic'})

[slope, intercept] = np.polyfit(data.Time, data.Temp, 1)
if slope > 25:
    plt.plot(data.Time, data.Temp, color="red", linewidth=1.5)
else:
    plt.plot(data.Time, data.Temp, color="black", linewidth=1.5)

plt.minorticks_on()
plt.grid(which='major', color='grey', linewidth=.8)
plt.grid(which='minor', color='lightgrey', linewidth=.4, ls='--')

plt.show()

图表需要的样子:

截至目前的图表:

import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_csv('ReactorStartupTemps.csv')
print(data)

plt.rcParams["figure.figsize"] = [7, 5]
plt.rcParams["figure.autolayout"] = True
plt.xlabel('Time [min]', fontdict = {'fontname': 'Times New Roman', 
'style': 'italic'})
plt.ylabel('Temperature [C]', fontdict = {'fontname': 'Times New 
Roman', 
'style': 'italic'})
plt.title('Reactor Startup Temperatures', fontdict = {'fontname': 
'Times 
New Roman', 'style': 'italic'})    
slope, intercept = np.polyfit(np.log(data.Time), np.log(data.Temp), 1)
if slope > 25 :
    plt.plot(data.Time, data.Temp, color = "red",linewidth = 1.5)
else:
    plt.plot(data.Time, data.Temp, color = "black",linewidth = 1.5)
plt.minorticks_on()
plt.grid(which = 'major', color = 'grey', linewidth = .8)
plt.grid(which = 'minor', color = 'lightgrey', linewidth = .4, ls = 
'--')

plt.show()

首先你必须计算斜率然后你可以实现你的条件

用于斜率计算

slope, intercept = np.polyfit(np.log(data.Time), np.log(data.Temp), 1)

目前您正在使用回归线的斜率。 np.polyfit 执行最小二乘法和 returns 拟合线的斜率,这不是您想要的。

相反,您正在寻找所有连续点之间的斜率:

  • 使用Series.diff计算所有连续点(y2-y1) / (x2-x1)
  • 使用Series.where屏蔽斜率超过25的线段
  • 使用高 zorder 提高屏蔽段
THRESHOLD = 25

slopes = data.Temp.diff() / data.Time.diff()
plt.plot(data.Time, data.Temp, color='k')
plt.plot(data.Time, data.Temp.where(slopes > THRESHOLD), color='r', zorder=10)