与matplotlib奇怪的情节

时间:2018-05-17 09:46:09

标签: python matplotlib plot

我试图使用 Python matplotlib 为特定建筑物绘制加热能源的需求配置文件。 但它不是单行,而是看起来像这样:

enter image description here

有没有人有这样的情节结果? 或者有人知道这里有什么想法吗?

相应的代码片段是:

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

        xs_heat = [x[0] for x in heating_datalist]
        ys_heat = [x[1] for x in heating_datalist]
        pyplot.plot(xs_heat, ys_heat, lw=0.5)              

pyplot.title(TT)

#get legend entries from list_of_buildings
list_of_entries = []
for b in list_of_buildings:
    list_of_entries.append(b.label)
pyplot.legend(list_of_entries)          
pyplot.xlabel("[min]")
pyplot.ylabel("[kWh]")

其他信息:

  • timesteps是一个像[0.00,0.01,0.02,...,23.59]的列表 - 一天中的分钟数(24 * 60值)
  • b.lp.heating_list是包含一些浮点值的列表
  • b.Q_Heiz_TT是一个常数

2 个答案:

答案 0 :(得分:0)

根据您的信息,我创建了一个应该重现您的问题的最小示例(如果没有,您可能没有详细解释问题/参数)。我建议你下次自己创建这样一个例子,因为如果没有它,你的问题可能会被忽略。示例如下所示:

import numpy as np
import matplotlib.pyplot as plt

N = 24*60
Q_Heiz_TT = 0.5
lp_heating_list = np.random.rand(N)
lp_heating_list = lp_heating_list*Q_Heiz_TT

heating_datalist = []

for d in range(N):
    heating_datalist.append((d, lp_heating_list[d]))
    xs_heat = [x[0] for x in heating_datalist]
    ys_heat = [x[1] for x in heating_datalist]
    plt.plot(xs_heat, ys_heat)

plt.show()

这里发生了什么?对于每个d in range(N)(使用N = 24*60,即每天的每一分钟),您可以绘制所有值,包括 lp_heating_list[d]d。这是因为heating_datalist附加了当前值dlp_heating_list中的相应值。你得到的是24x60 = 1440行,彼此部分重叠。根据后端处理事物的方式,它可能会很慢并且看起来很混乱。

更好的方法是简单地使用

plt.plot(range(timesteps), lp_heating_list)
plt.show()

其中只绘制了一行,而不是1440行。

答案 1 :(得分:0)

我怀疑代码中存在缩进问题。

试试这个:

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

xs_heat = [x[0] for x in heating_datalist]  # <<<<<<<<
ys_heat = [x[1] for x in heating_datalist]  # <<<<<<<<
pyplot.plot(xs_heat, ys_heat, lw=0.5)       # <<<<<<<<

这样你每个建筑物只能绘制一条线,这可能是你想要的。

此外,您可以使用zip生成x值和y值,如下所示:

xs_heat, ys_heat = zip(*heating_datalist)

这可行,因为zip is it's own inverse!