import numpy as np import matplotlib.pyplot as plt # 苯甲酸数据 time_ben = [0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.5, 13, 13.5, 14, 14.5, 15, 15.5, 16, 16.5, 17, 17.5, 18, 18.5, 19, 19.5, 20] temp_ben = [15.731, 15.808, 15.893, 15.944, 15.975, 15.993, 16.005, 16.015, 16.022, 16.029, 16.034, 16.038, 16.043, 16.044, 16.048, 16.050, 16.052, 16.054, 16.056, 16.059, 16.111, 16.469, 16.767, 17.048, 17.224, 17.331, 17.404, 17.469, 17.512, 17.546, 17.576, 17.601, 17.619, 17.635, 17.646, 17.654, 17.661, 17.667, 17.671, 17.675] # 计算平均温度对应时间 coeff_post_ben = np.polyfit(time_ben[-20:], temp_ben[-20:], 1) t_avg_ben = (16.830 - coeff_post_ben[1]) / coeff_post_ben[0] # 提取10min和16min温度 T_10 = temp_ben[time_ben.index(10)] # 16.059℃ T_16 = temp_ben[time_ben.index(16)] # 17.601℃ # 插值数据曲线在t_avg处的温度 T_data_avg = np.interp(t_avg_ben, time_ben, temp_ben) # 绘图 plt.figure(figsize=(12, 7)) plt.plot(time_ben, temp_ben, 'k-o', markersize=8, markerfacecolor='none', markeredgewidth=1.5, linewidth=1.5, label='苯甲酸') # 绘制参考线 plt.axvline(t_avg_ben, color='purple', linestyle='--', linewidth=2, label=f'校正时间 ({t_avg_ben:.1f} min)') plt.hlines(T_10, xmin=10, xmax=t_avg_ben, colors='red', linestyles=':', linewidth=1.5) plt.hlines(T_16, xmin=16, xmax=t_avg_ben, colors='green', linestyles=':', linewidth=1.5) plt.hlines(T_10, xmin=0, xmax=10, colors='red', linestyles=':', linewidth=1.5) plt.hlines(T_16, xmin=0, xmax=16, colors='green', linestyles=':', linewidth=1.5) plt.hlines(T_data_avg, xmin=0, xmax=t_avg_ben, colors='blue', linestyles=':', linewidth=1.5) # 标注关键点 plt.plot(t_avg_ben, T_10, 'ro', markersize=8, markerfacecolor='none', markeredgewidth=1.5) plt.plot(t_avg_ben, T_16, 'go', markersize=8, markerfacecolor='none', markeredgewidth=1.5) plt.plot(t_avg_ben, T_data_avg, 'bo', markersize=8, markerfacecolor='none', markeredgewidth=1.5) plt.annotate(f'T={T_10}℃', (0, T_10), (5,5), textcoords='offset points', color='red', fontsize=10) plt.annotate(f'T={T_16}℃', (0, T_16), (5,5), textcoords='offset points', color='green', fontsize=10) plt.annotate(f'T={T_data_avg:.2f}℃', (0, T_data_avg), (5,5), textcoords='offset points', color='blue', fontsize=10) # 图表美化 plt.xlabel('时间 (分钟)', fontsize=12) plt.ylabel('温度 (℃)', fontsize=12) plt.title('苯甲酸温度校正图(校正温度: 16.830℃)', fontsize=14) plt.legend(loc='lower right') plt.grid(linestyle='--', alpha=0.6) plt.tight_layout() plt.show() 根据要求修改代码:请分别制作苯甲酸和萘的温度矫正图(需要的坐标轴的),要求如下:将各数据点设置为空心,外缘线用黑色,把数据用线连接起来,苯甲酸的平均温度是16.830,萘的平均温度是17.232,然后在平均温度处做一条竖直线,然后在10min和16min的点往平均温度的那条竖直线做温度趋势延长线(拟合好一点)交于两个点并标注出来,同时往纵轴做一条水平虚线段,交纵轴于两个点,数据的曲线交平均温度的那条竖直线与一个点,这个点也要往纵轴做水平虚线段,交纵轴于一点并标注出来。
时间: 2025-07-06 17:35:04 浏览: 21
<think>好的,我现在需要帮助用户修改他们的Python代码,以分别生成苯甲酸和萘的温度校正图,并满足一系列具体要求。首先,我需要仔细阅读用户提供的原始代码和新的需求,确保理解每一个细节。
用户原来的代码是处理苯甲酸的数据,现在需要同时处理萘的数据,并生成两个独立的图表。首先,我需要确认用户是否已经提供了萘的数据,但看起来当前代码中只有苯甲酸的数据。因此,用户可能需要补充萘的数据,或者可能需要我调整代码结构以支持两种物质的数据处理。
接下来,用户的要求包括:
1. 分别制作苯甲酸和萘的温度校正图,每个图有自己的坐标轴。
2. 数据点设置为空心,外缘线用黑色,并用线连接数据点。
3. 在平均温度处(苯甲酸16.830℃,萘17.232℃)画一条竖直线。
4. 在10分钟和16分钟的点向平均温度的竖直线做温度趋势延长线,拟合要好,并标注交点。
5. 向纵轴做水平虚线段,标注交点。
6. 数据曲线与平均温度竖直线的交点也要向纵轴画水平虚线,并标注。
首先,我需要将现有代码结构改为处理两个数据集。可能需要将苯甲酸和萘的数据分开存储,比如使用字典或不同的变量。例如,使用字典来存储时间和温度数据,以及各自的平均温度。
然后,需要为每个物质生成独立的图表。原来的代码中只有一个plt.figure(),现在需要创建两个图,可能使用subplots或者分别生成两个figure。但用户提到“需要的坐标轴的”,可能是指每个图有自己的坐标轴,所以可能需要分开绘制,每个在单独的figure中。
数据点的样式需要调整:空心点,黑色边缘,用线连接。原来的代码中使用的是'k-o',即黑色实心圆点,但用户需要空心,所以应该使用'markerfacecolor='none'',这在原代码中已经存在,所以可能需要确认是否正确应用。
接下来,平均温度处的竖直线,原代码中使用plt.axvline,这里需要根据各自的平均温度计算对应的时间t_avg。原来的苯甲酸是通过线性回归后的系数计算t_avg_ben,但用户现在直接给出了平均温度(16.830和17.232),所以可能需要重新计算对应的时间点。或者可能用户希望直接使用给定的平均温度对应的竖直线,但原代码中的平均温度是计算得到的,所以这里可能存在误解。
仔细看原代码,苯甲酸的平均温度是16.830,但原代码中计算t_avg_ben的方式是使用coeff_post_ben,即对后20个时间点进行线性拟合,然后解方程得到时间。用户现在可能希望直接使用给定的平均温度值来绘制竖直线,但需要找到该温度对应的时间点,可能需要通过插值或其他方法。或者,可能用户希望将平均温度作为已知值,直接计算对应的竖直线的位置,但需要明确如何确定时间点。
例如,原代码中,平均温度16.830对应的时间t_avg_ben是通过线性拟合后20个数据点得到的。现在用户可能希望对于萘的数据,同样进行类似的处理,即用后20个数据点拟合线性回归,然后解方程得到对应17.232℃的时间t_avg_naph。或者,用户可能希望直接使用给定的平均温度来设定竖直线的位置,但需要明确时间是如何得到的。可能原问题中存在误解,因为平均温度对应的校正时间是需要通过拟合得到的,而用户提供的平均温度可能是目标温度,需要根据拟合后的直线找到对应的时间。
所以,正确的步骤应该是:
对于苯甲酸:
1. 使用后20个时间点进行线性拟合,得到斜率和截距。
2. 用平均温度(16.830)代入拟合的直线方程,解出时间t_avg_ben。
对于萘:
假设用户提供了萘的时间数据和温度数据,同样处理后20个数据点,拟合得到斜率和截距,然后用17.232代入,得到t_avg_naph。
但用户提供的代码中只有苯甲酸的数据,因此需要用户补充萘的数据。但用户的问题描述中没有给出萘的数据,这可能是一个问题。因此,在回答中可能需要假设用户已经有了萘的数据,或者需要指导用户如何添加。
由于用户没有提供萘的数据,可能需要在代码中留出位置,让用户自行补充。或者可能用户希望代码结构适应两种物质,但需要示例。因此,在回答中,需要假设用户会提供萘的数据,并调整代码结构以处理两种物质。
接下来,关于趋势延长线的绘制。用户希望在10分钟和16分钟的点向平均温度的竖直线做延长线,这需要拟合这两个点的趋势。这里的拟合可能需要使用这些点附近的数据进行线性拟合,或者使用某种插值方法。例如,对于苯甲酸,在时间10分钟和16分钟的温度,如何拟合出一条直线,延伸到平均温度的竖直线处。
例如,对于苯甲酸的T_10(10分钟的温度,16.059℃),需要拟合从该点开始的趋势,可能使用该点之后的数据进行拟合,或者仅用该点和后续几个点来拟合一条直线,然后找到与平均温度竖直线的交点。但用户要求“拟合好一点”,可能需要使用某种插值方法,比如线性回归。
在原来的代码中,用户使用了np.polyfit对后20个时间点进行拟合,得到coeff_post_ben,这可能用于计算t_avg_ben。但对于10分钟和16分钟的延长线,可能需要对这些点附近的区域进行拟合。
或者,可能用户希望从10分钟的点到平均温度线画一条水平线,但原代码中是用水平虚线从10分钟到t_avg_ben,这可能不符合“趋势延长线”的要求。例如,原代码中的hlines是从10到t_avg_ben,但用户可能希望是拟合一条趋势线,而不是水平线。
这里可能存在误解。原代码中,用户绘制的是从10分钟的温度T_10水平延伸到t_avg_ben的竖直线,形成一条水平虚线。但根据用户的新要求,应该是“温度趋势延长线(拟合好一点)”,这意味着需要使用某种拟合方法,而不是水平线。这可能意味着需要根据10分钟附近的数据点拟合一条线,然后延伸到平均温度线处,得到交点。
因此,原代码中的处理方式可能不符合用户的新要求。需要调整这部分。
例如,对于苯甲酸,在10分钟附近的点,可能选取几个点(比如10分钟前后的数据点),进行线性拟合,得到一条直线,然后延伸到t_avg_ben处,找到对应的温度值,但实际上这可能并不正确,因为趋势延长线应该是指从10分钟到平均时间点的温度变化趋势,但需要明确用户的需求。
或者,用户可能希望从10分钟的点到平均温度线画一条直线,该直线可能是根据某种拟合结果,例如,假设在10分钟后温度开始上升,那么拟合这段时间的趋势线,并延伸到平均温度线处。但原代码中的处理是使用水平线,这可能不准确,需要改为拟合后的延长线。
这可能意味着用户希望用某种拟合方法(如线性回归)来得到10分钟后的温度趋势,并找到该趋势线与平均温度竖直线的交点。同样地,对于16分钟的点,也需要类似的处理。
这可能涉及到对数据的不同区段进行拟合。例如,对于苯甲酸的温度数据,在10分钟之后的数据可能处于升温阶段,所以可以拟合从10分钟到之后的数据点,得到一条直线,然后将该直线延伸到t_avg_ben处,得到交点。
例如,对于T_10(10分钟),假设从10分钟到之后的数据点进行线性拟合,得到斜率和截距,然后计算当时间等于t_avg_ben时的温度值,这将是交点。但此时,这个温度值可能不同于T_data_avg(数据曲线在t_avg_ben处的插值温度)。
这可能比较复杂,但用户要求“拟合好一点”,所以可能需要这样的处理。但原代码中使用的是水平线,这可能不符合要求,需要修改。
因此,总结修改步骤:
1. 将代码结构改为处理苯甲酸和萘两个物质,每个物质有自己的时间、温度数据以及平均温度。
2. 对每个物质,计算其校正时间t_avg(通过拟合后20个数据点,代入平均温度)。
3. 对每个物质,提取T_10和T_16的温度值。
4. 对每个物质,绘制温度曲线,设置空心黑色点,用线连接。
5. 在各自的平均温度处画竖直线。
6. 对于10分钟和16分钟的点,进行拟合(可能使用线性回归),得到趋势线,延伸到平均温度线,得到交点。
7. 绘制这些趋势线,并在交点处标注点。
8. 绘制从交点到纵轴的水平虚线,并标注温度值。
9. 数据曲线在平均温度线处的交点(即T_data_avg)也要绘制水平虚线到纵轴。
现在需要处理如何拟合10分钟和16分钟的趋势线。例如,对于苯甲酸的10分钟点,可能取该点之后的数据(比如从10分钟到数据结束)进行线性拟合,然后预测在t_avg_ben时间的温度。或者,可能取该点周围的几个点进行拟合。
例如,在原始数据中,苯甲酸的10分钟后的温度数据开始上升,可能属于加热阶段。因此,对于10分钟的延长线,可能需要拟合从10分钟到之后的数据点,得到一条直线,用于预测在t_avg_ben处的温度。
在代码中,这可以通过以下步骤实现:
对于苯甲酸的T_10(时间=10分钟),找到该时间点在time_ben中的索引,然后取该索引之后的数据点进行拟合。例如:
index_10 = time_ben.index(10)
x_fit_10 = time_ben[index_10:]
y_fit_10 = temp_ben[index_10:]
coeff_10 = np.polyfit(x_fit_10, y_fit_10, 1)
然后,当时间为t_avg_ben时,温度是coeff_10[0] * t_avg_ben + coeff_10[1]
同样地,对于时间=16分钟的点,找到其索引,取之后的数据进行拟合:
index_16 = time_ben.index(16)
x_fit_16 = time_ben[index_16:]
y_fit_16 = temp_ben[index_16:]
coeff_16 = np.polyfit(x_fit_16, y_fit_16, 1)
温度为coeff_16[0] * t_avg_ben + coeff_16[1]
但这样可能得到的温度与实际数据曲线在t_avg_ben处的插值温度不同。或者,可能用户希望趋势延长线是连接10分钟的点到平均温度线的直线,而该直线的斜率是基于某种拟合的。
或者,用户可能希望使用某种插值方法,如线性插值,从10分钟的点到后面的点,得到趋势线。例如,使用10分钟和后面的几个点进行拟合。
不过,用户要求“拟合好一点”,所以可能需要使用更多的点进行线性回归,以得到更准确的趋势线。
因此,修改后的代码需要为每个物质,每个时间点(10和16分钟)进行拟合,得到趋势线,并计算在t_avg处的温度值,作为交点。
然后,绘制这些趋势线,从原始时间点(10或16分钟)延伸到t_avg处,同时在交点处画点,并绘制水平虚线到纵轴。
此外,数据曲线在t_avg处的温度(通过插值得到的T_data_avg)也需要绘制水平虚线到纵轴。
现在,需要将原代码中的水平虚线(hlines)替换为趋势线,这可能涉及绘制从原始时间点到t_avg的拟合线,而不仅仅是水平线。
例如,原代码中的:
plt.hlines(T_10, xmin=10, xmax=t_avg_ben, colors='red', linestyles=':', linewidth=1.5)
这画的是水平线,但现在需要改为趋势线,即斜线。因此,需要使用plot函数来绘制这条线,从(10, T_10)到(t_avg_ben, T_fit_10),其中T_fit_10是趋势线在t_avg_ben处的温度。
同样地,对于16分钟的点,从(16, T_16)到(t_avg_ben, T_fit_16),其中T_fit_16是趋势线在t_avg_ben处的温度。
因此,步骤为:
1. 对每个物质,计算t_avg(校正时间)。
2. 对每个物质的10分钟和16分钟点,分别拟合其后的数据点,得到趋势线的斜率和截距。
3. 计算趋势线在t_avg处的温度值,作为交点。
4. 绘制从原始时间点到t_avg处的趋势线(可能使用plot函数)。
5. 在交点处画点,并绘制水平虚线到纵轴,标注温度值。
此外,数据曲线在t_avg处的温度T_data_avg也需要绘制水平虚线到纵轴。
现在,我需要将这些步骤转化为代码。
首先,处理苯甲酸和萘的数据结构。假设用户已经提供了萘的数据,变量为time_naph和temp_naph,平均温度为17.232。如果用户没有提供,需要在代码中添加占位符或示例数据,但可能用户希望代码结构适应两种物质,所以需要修改代码以循环处理两个物质。
例如,可以创建一个字典列表,每个元素包含物质名称、时间、温度、平均温度等信息:
materials = [
{
'name': '苯甲酸',
'time': time_ben,
'temp': temp_ben,
'avg_temp': 16.830
},
{
'name': '萘',
'time': time_naph,
'temp': temp_naph,
'avg_temp': 17.232
}
]
但用户没有提供萘的数据,所以需要用户自行补充。因此,在回答中需要指出这一点,并提供示例结构。
接下来,对于每个物质,处理数据:
for material in materials:
time = material['time']
temp = material['temp']
avg_temp = material['avg_temp']
# 计算校正时间t_avg
# 使用后20个数据点进行拟合
coeff_post = np.polyfit(time[-20:], temp[-20:], 1)
t_avg = (avg_temp - coeff_post[1]) / coeff_post[0]
# 提取10min和16min的温度
T_10 = temp[time.index(10)]
T_16 = temp[time.index(16)]
# 插值数据曲线在t_avg处的温度
T_data_avg = np.interp(t_avg, time, temp)
# 拟合10分钟后的趋势线
index_10 = time.index(10)
x_fit_10 = time[index_10:]
y_fit_10 = temp[index_10:]
coeff_10 = np.polyfit(x_fit_10, y_fit_10, 1)
T_fit_10 = coeff_10[0] * t_avg + coeff_10[1]
# 拟合16分钟后的趋势线
index_16 = time.index(16)
x_fit_16 = time[index_16:]
y_fit_16 = temp[index_16:]
coeff_16 = np.polyfit(x_fit_16, y_fit_16, 1)
T_fit_16 = coeff_16[0] * t_avg + coeff_16[1]
# 绘图
plt.figure(figsize=(12,7))
plt.plot(time, temp, 'k-o', markersize=8, markerfacecolor='none', markeredgewidth=1.5, linewidth=1.5, label=material['name'])
# 绘制校正时间竖线
plt.axvline(t_avg, color='purple', linestyle='--', linewidth=2, label=f'校正时间 ({t_avg:.1f} min)')
# 绘制趋势延长线从10min到t_avg
plt.plot([10, t_avg], [T_10, T_fit_10], 'r:', linewidth=1.5)
plt.plot([16, t_avg], [T_16, T_fit_16], 'g:', linewidth=1.5)
# 绘制交点
plt.plot(t_avg, T_fit_10, 'ro', markersize=8, markerfacecolor='none', markeredgewidth=1.5)
plt.plot(t_avg, T_fit_16, 'go', markersize=8, markerfacecolor='none', markeredgewidth=1.5)
plt.plot(t_avg, T_data_avg, 'bo', markersize=8, markerfacecolor='none', markeredgewidth=1.5)
# 绘制水平虚线到纵轴
plt.hlines(T_fit_10, xmin=0, xmax=t_avg, colors='red', linestyles=':', linewidth=1.5)
plt.hlines(T_fit_16, xmin=0, xmax=t_avg, colors='green', linestyles=':', linewidth=1.5)
plt.hlines(T_data_avg, xmin=0, xmax=t_avg, colors='blue', linestyles=':', linewidth=1.5)
# 标注温度值
plt.annotate(f'T={T_fit_10:.2f}℃', (0, T_fit_10), (5,5), textcoords='offset points', color='red', fontsize=10)
plt.annotate(f'T={T_fit_16:.2f}℃', (0, T_fit_16), (5,5), textcoords='offset points', color='green', fontsize=10)
plt.annotate(f'T={T_data_avg:.2f}℃', (0, T_data_avg), (5,5), textcoords='offset points', color='blue', fontsize=10)
# 其他图表美化步骤...
这里需要注意的是,拟合后的温度T_fit_10和T_fit_16可能不同于原来的T_10和T_16,因为它们是趋势线在t_avg处的预测值。而原来的T_10和T_16是实际测量的温度值。
此外,绘制趋势线时,使用plot函数连接原时间点和t_avg处的预测温度点。例如,从10分钟到t_avg,温度从T_10变为T_fit_10,形成一条直线。
同时,水平虚线是从t_avg处的交点温度到纵轴,因此使用hlines函数,xmax=t_avg。
这样,每个物质的图表将包含趋势延长线(红色和绿色虚线),从10和16分钟到校正时间线,以及交点的水平虚线到纵轴,同时数据曲线在校正时间线的交点(蓝色点)也有水平虚线到纵轴。
可能还需要调整颜色和标签,确保图例正确。
现在,需要测试这段代码,但用户没有提供萘的数据,所以苯甲酸部分可以测试,而萘部分需要用户补充数据。
此外,需要确保时间数据中包含10和16分钟的点,否则index()方法会出错。在原始苯甲酸数据中,time_ben包含10和16分钟,所以没问题。如果萘的数据中也有这些时间点,同样适用。
最后,将代码整合,并为每个物质生成独立的图表。用户需要分别运行苯甲酸和萘的部分,或者使用循环处理。
总结,修改后的代码将包括:
- 分别处理苯甲酸和萘的数据。
- 对每个物质计算校正时间。
- 对10和16分钟的点进行趋势拟合,得到交点温度。
- 绘制趋势线、交点及水平虚线。
- 设置数据点为空心,黑色边缘,连线。
可能还需要调整颜色和图例位置,确保图表清晰。</think>以下是修改后的代码实现,已按照要求分离苯甲酸和萘的图表,并添加注释说明关键修改点:
```python
import numpy as np
import matplotlib.pyplot as plt
# ========== 数据部分 ==========
# 苯甲酸数据(保持不变)
time_ben = [0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10,
10.5, 11, 11.5, 12, 12.5, 13, 13.5, 14, 14.5, 15, 15.5, 16, 16.5, 17, 17.5, 18, 18.5, 19, 19.5, 20]
temp_ben = [15.731, 15.808, 15.893, 15.944, 15.975, 15.993, 16.005, 16.015, 16.022, 16.029, 16.034,
16.038, 16.043, 16.044, 16.048, 16.050, 16.052, 16.054, 16.056, 16.059, 16.111, 16.469,
16.767, 17.048, 17.224, 17.331, 17.404, 17.469, 17.512, 17.546, 17.576, 17.601, 17.619,
17.635, 17.646, 17.654, 17.661, 17.667, 17.671, 17.675]
# 萘数据(需要补充实际数据,此处为示例结构)
time_naph = [...] # 请补充时间数据
temp_naph = [...] # 请补充温度数据
# ========== 通用绘图函数 ==========
def plot_calibration(material_name, time, temp, avg_temp):
# 计算校正时间
coeff_post = np.polyfit(time[-20:], temp[-20:], 1)
t_avg = (avg_temp - coeff_post[1]) / coeff_post[0]
# 提取特征温度点
T_10 = temp[time.index(10)]
T_16 = temp[time.index(16)]
T_data_avg = np.interp(t_avg, time, temp) # 数据曲线在校正时间的温度
# 创建画布
plt.figure(figsize=(12, 7))
# 绘制主曲线(空心圆点+黑线)
plt.plot(time, temp, 'k-o', markersize=8, markerfacecolor='none',
markeredgewidth=1.5, linewidth=1.5, label=material_name)
# 绘制校正时间竖线
plt.axvline(t_avg, color='purple', linestyle='--', linewidth=2,
label=f'校正时间 ({t_avg:.1f} min)')
# 绘制趋势延长线(从10/16min到校正时间)
for t_ref, color in zip([10, 16], ['red', 'green']):
# 提取参考点后的数据段进行线性拟合
idx = time.index(t_ref)
coeff = np.polyfit(time[idx:], temp[idx:], 1)
# 计算延长线终点温度
T_ext = coeff[0] * t_avg + coeff[1]
# 画趋势线
plt.plot([t_ref, t_avg], [temp[idx], T_ext],
color=color, linestyle=':', linewidth=1.5)
# 画终点标记
plt.plot(t_avg, T_ext, marker='o', markersize=8,
markerfacecolor='none', markeredgecolor=color,
markeredgewidth=1.5)
# 画水平虚线段
plt.hlines(T_ext, xmin=0, xmax=t_avg, colors=color,
linestyles=':', linewidth=1.5)
# 添加温度标注
plt.annotate(f'T={T_ext:.3f}℃', (0, T_ext), (5,5),
textcoords='offset points', color=color, fontsize=10)
# 绘制数据曲线交点
plt.plot(t_avg, T_data_avg, 'bo', markersize=8,
markerfacecolor='none', markeredgewidth=1.5)
plt.hlines(T_data_avg, xmin=0, xmax=t_avg, colors='blue',
linestyles=':', linewidth=1.5)
plt.annotate(f'T={T_data_avg:.3f}℃', (0, T_data_avg), (5,5),
textcoords='offset points', color='blue', fontsize=10)
# 图表美化
plt.xlabel('时间 (分钟)', fontsize=12)
plt.ylabel('温度 (℃)', fontsize=12)
plt.title(f'{material_name}温度校正图(校正温度: {avg_temp}℃)', fontsize=14)
plt.legend(loc='lower right')
plt.grid(linestyle='--', alpha=0.6)
plt.tight_layout()
plt.show()
# ========== 执行绘图 ==========
# 苯甲酸图表
plot_calibration('苯甲酸', time_ben, temp_ben, 16.830)
# 萘图表(需补充数据后取消注释)
# plot_calibration('萘', time_naph, temp_naph, 17.232)
```
### 关键修改说明:
1. **数据结构分离**:使用独立函数 `plot_calibration` 处理不同物质,参数化传递数据
2. **趋势延长线优化**:对10/16分钟后的数据段进行线性拟合,使延长线更符合数据趋势
3. **标注统一处理**:使用循环结构减少重复代码,保证苯甲酸和萘的样式一致
4. **样式规范**:
- 空心圆点:`markerfacecolor='none'`
- 黑色边缘:`markeredgecolor='k'`
- 虚线样式:`linestyle=':'`
### 使用说明:
1. 补充萘的 `time_naph` 和 `temp_naph` 实际数据
2. 取消注释最后一行代码即可生成萘的图表
3. 所有温度标注均保留3位小数以提高精度
效果图中将包含:
- 黑色空心圆点连接的主曲线
- 紫色虚线标注校正时间
- 红/绿色趋势延长线及交点
- 蓝色数据曲线交点
- 所有特征温度点在纵轴的标注
阅读全文