在Python绘图中添加两条线之间的最小温差

1 投票
1 回答
43 浏览
提问于 2025-04-14 16:22

在我的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()

这段代码生成了下面这个图:

Graph

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

enter image description here

我不太确定该怎么做。有人能给我一些建议吗?谢谢!

1 个回答

3

你可以通过计算 y2filly1fill 之间的差值,使用 argminargmax 来找到最小值和最大值的位置。然后可以用 vlinesannotate 来标记这些位置。

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'
            )

输出结果:

matplotlib 画出两条曲线之间的最小最大差值的竖线

示例输入:

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,])))

撰写回答