Странный сюжет с матплотлибом - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь построить профиль спроса на тепловую энергию для конкретного здания с 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 голосов
/ 17 мая 2018

Я подозреваю, что в вашем коде есть проблема с отступом.

Попробуйте это:

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 является его собственным обратным!

0 голосов
/ 17 мая 2018

На основании вашей информации я создал минимальный пример, который должен воспроизвести вашу проблему (в противном случае вы, возможно, не объяснили проблему / параметры достаточно подробно). Я призываю вас самим создать такой пример в следующий раз, поскольку ваш вопрос, вероятно, будет проигнорирован без него. Пример выглядит так:

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 добавляется текущее значение d и соответствующее значение в lp_heating_list. Вы получаете 24x60 = 1440 линий, которые частично перекрывают друг друга. В зависимости от того, как ваш бэкэнд обрабатывает вещи, он может быть очень медленным и начать выглядеть грязно.

Намного лучше было бы просто использовать

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

Который строит только одну линию вместо 1440.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...