使用Matplotlib绘制建筑供热需求曲线出现异常折线求助
供热能耗曲线绘图异常问题排查
嘿,你遇到的这种乱线/非连续折线的情况我之前帮好几个朋友排查过,大概率是代码逻辑或者数据顺序的问题,咱们一步步来捋清楚:
一、先揪出代码里的明显漏洞
看你贴的代码片段,这里有个致命的逻辑问题:
for b in list_of_buildings: print(b.label, b.Q_Heiz_a, b.Q_Heiz_TT, len(b.lp.heating_list)) heating_datalist=[] for d in range(timesteps): b.lp.heating_list[d] = b.lp.heating_list[d]*b.Q_Heiz_TT heating_datalist.append((d, b.lp.heating_list[d]))
第一个for b in list_of_buildings循环结束后,b会停留在列表最后一个建筑的对象上,后面的循环只在处理这最后一个建筑的数据,但你后面又给图例加了所有建筑的标签——这不仅会导致图例和绘图完全不匹配,而且你说timesteps是[0.00,0.01,...23.59]的分钟列表,range(timesteps)会直接报错(因为range()只接受整数参数),这说明你实际代码里的循环逻辑肯定是乱的,这绝对是导致异常图形的原因之一。
二、核心问题推测(图形异常的关键)
结合你补充的信息,还有这种乱线的表现,最可能的两个原因:
- x轴数据没有按时间顺序排列:如果
xs_heat里的时间值不是严格从小到大递增的,Matplotlib会按照数据的原始顺序连线,就会出现来回跳转的乱线。比如timesteps的顺序被打乱,或者你取d的时候不是按时间顺序来的。 - 多建筑数据混在一起绘图:如果没有给每个建筑单独处理数据并绘图,而是把所有建筑的能耗数据塞进同一个列表里,就会出现线段交叉混乱的情况。
三、修正后的代码示例
我帮你重新梳理了正确的逻辑,每个建筑单独处理数据并绘图,同时确保x轴顺序正确:
import matplotlib.pyplot as plt # 遍历每个建筑,分别处理数据并绘制曲线 for b in list_of_buildings: print(b.label, b.Q_Heiz_a, b.Q_Heiz_TT, len(b.lp.heating_list)) # 先确保能耗数据和时间序列长度一致,避免错位 assert len(b.lp.heating_list) == len(timesteps), f"{b.label}的数据长度和时间序列不匹配!" # 计算缩放后的能耗值 ys_heat = [heat_val * b.Q_Heiz_TT for heat_val in b.lp.heating_list] # 直接用有序的timesteps作为x轴,保证顺序正确 xs_heat = timesteps # 绘制当前建筑的曲线,顺便把label传进去,后面直接调用legend就行 plt.plot(xs_heat, ys_heat, lw=0.5, label=b.label) # 添加图表的各种元素 plt.title(TT) plt.legend() plt.xlabel("[min]") plt.ylabel("[kWh]") plt.show()
四、额外需要排查的点
- 检查
timesteps是否严格递增:可以加一行assert timesteps == sorted(timesteps), "时间序列不是从小到大排列的!"来验证,如果触发断言,说明时间顺序乱了,先把timesteps排序再用。 - 排查能耗数据里的异常值:比如有没有NaN或者无穷大的数值,这些会导致绘图出现断点或者异常线段,可以用
import numpy as np; assert not np.isnan(b.lp.heating_list).any(), f"{b.label}的能耗数据里有NaN值!"来检查。 - 确认每个建筑的
b.lp.heating_list长度都和timesteps一致:长度不匹配的话,绘图时会出现数据错位的问题。
内容的提问来源于stack exchange,提问作者Tybald
相关产品推荐
相关产品推荐

