在Python绘图中添加两条线之间的最小温差
在我的Python绘图中,我想找出两条线在y轴方向上,伴随x值的情况下,温度差最大的和最小的。我的代码如下:
# IMPORT MODULES
import numpy as np
import pandas as pd
import csv
import matplotlib.pyplot as plt
import datetime
import time
from scipy.signal import find_peaks, peak_prominences
import os
# PARAMETERS
simulationtype = "temperature"
filename = "v22plot_"+simulationtype+"curve.txt" # VARIABLE
setTemp = 210
# LOAD DATA AND CREATE COLUMNS
df = pd.read_csv(filename, delim_whitespace=True,skiprows=4, encoding='latin1')
x1 = df.iloc[:,0]
y1 = df.iloc[:,1]
x2 = df.iloc[:,2]
y2 = df.iloc[:,3]
x3 = df.iloc[:,4]
y3 = df.iloc[:,5]
# CREATE PLOT
fig1 = plt.gcf()
plt.axhline(y = setTemp, color = '0.5', linestyle = '--')
plt.plot(x1, y1, '*--', linewidth=2, markersize=3, label="Insert_TC")
plt.plot(x2, y2, '*--', linewidth=2, markersize=3, label="MS_TC")
plt.plot(x3, y3, '*--', linewidth=2, markersize=3, label="FS_TC")
xfill = np.sort(np.concatenate([x2, x3]))
y1fill = np.interp(xfill, x2, y2)
y2fill = np.interp(xfill, x3, y3)
plt.fill_between(xfill, y1fill, y2fill, where=y1fill < y2fill, interpolate=True, color='dodgerblue', alpha=0.2)
plt.fill_between(xfill, y1fill, y2fill, where=y1fill > y2fill, interpolate=True, color='crimson', alpha=0.2)
plt.grid('on', color='grey', linestyle='-', linewidth=0.25)
plottitle = 'Temperature'
plt.title(plottitle)
plt.xlabel('Time [s]')
plt.ylabel('Temperature [°C]')
plt.legend(loc='upper center', ncol=1,bbox_to_anchor=(1.1, 1.), fancybox=True, shadow=True, fontsize="8")
# GENERATE PLOTNAME
timestr = time.strftime("%Y%m%d")
plotname = timestr + "_" + plottitle
# SAVE PLOT
plt.savefig(plotname, dpi= 300, bbox_inches='tight')
plt.show()
这段代码生成了下面这个图:

不过,我想在我的图上添加温度差最大和最小的值以及它们的位置。下面的图片展示了我想要的效果:

我不太确定该怎么做。有人能给我一些建议吗?谢谢!
1 个回答
3
你可以通过计算 y2fill
和 y1fill
之间的差值,使用 argmin
和 argmax
来找到最小值和最大值的位置。然后可以用 vlines
和 annotate
来标记这些位置。
diff = y2fill-y1fill
min_idx = np.argmin(diff)
max_idx = np.argmax(diff)
plt.vlines(xfill[min_idx], y1fill[min_idx], y2fill[min_idx],
color='k', ls='--')
plt.annotate(f'ΔTmin = {diff[min_idx]:.1f}°C',
(xfill[min_idx], y1fill[min_idx]),
xytext=(0, -5), textcoords='offset points',
ha='center', va='top'
)
plt.vlines(xfill[max_idx], y1fill[max_idx], y2fill[max_idx],
color='k', ls='--')
plt.annotate(f'ΔTmax = {diff[max_idx]:.1f}°C',
(xfill[max_idx], y1fill[max_idx]),
xytext=(0, -5), textcoords='offset points',
ha='center', va='top'
)
输出结果:
示例输入:
import pandas as pd
import numpy as np
xs = np.linspace(2500, 2620, 200)
df = pd.DataFrame(dict(enumerate([xs, np.sin(xs/30)*5+210,
xs, np.sin(xs/30-4)+210,
xs, np.sin(xs/25-5)+220,])))