Есть ли способ опустить точки данных на графике, если в отдельном списке есть значение ошибки? - PullRequest
1 голос
/ 12 апреля 2020

Чтобы сделать его максимально простым, я пытаюсь построить график зависимости времени от времени для данных из файла .DAT. Я строю точки каждые 10 минут в течение 24 часов. Из-за того, как файл данных отформатирован и моя реализация, временные данные представляют собой список строк.

У меня есть отдельный список, который дает значение ошибки для каждого экземпляра ставки. Если ошибка! = 0, я хочу опустить точку тарифа на графике, но оставить ось X для времени такой же.

Пока что мне остается только добавить список значений тарифа и времени в соответствии с оператором if, говорящим:

for line in file:
    columns = line.split()

    #throws out all instances of 0 in specified column
    if(int(columns[5]) == 0:

        hhmmss.append(str(columns[1]))
        lv0rate.append(float(columns[3]))
        error.append(int(columns[5]))

Однако это приводит к тому, что моя ось х "сжимается" для ошибочных точек, и я хочу, чтобы ось х оставалась неизменной в течение 24 часов период.

Я строю это на сетке 3x3, поэтому мои управляющие функции для настройки фигуры выглядят так:

# plot
fig, axs = plt.subplots(3, 3)
fig.subplots_adjust(left=0.2, wspace=0.6)
make_plot(axs)

# alignment of axes
fig.align_ylabels(axs[:, 1])

# set the x major locator
for axi in axs.flat:
    axi.xaxis.set_major_locator(plt.MaxNLocator(30))
fig

for axs in fig.axes:
    plt.sca(axs)
    plt.xticks(rotation=70)

plt.rcParams['axes.grid'] = True
plt.show()

Спасибо!

1 Ответ

1 голос
/ 12 апреля 2020

Ось x "сжимается", потому что они являются строками, и нет понятия расстояния между значениями x, вам необходимо преобразовать hhmmss в объект datetime:

import pandas as pd

hhmmss = ['00:00:00', '01:00:00', '02:00:00', '05:00:00']
hhmmss_time = [pd.Timestamp(time) for time in hhmmss]
print(hhmmss_time)

# Timestamp('2020-04-12 00:00:00'),
# Timestamp('2020-04-12 01:00:00'),
# ...

Вы можете построить график, используя hhmmss_time, поскольку это Timestamp объект, но, как вы можете видеть, он назначает текущую дату времени, однако вы можете использовать опции форматирования из matplotlib для отображения только информации о времени

hours = mdates.HourLocator(interval = 1)
h_fmt = mdates.DateFormatter('%H:%M:%S')

# ...

ax.xaxis.set_major_locator(hours)
ax.xaxis.set_major_formatter(h_fmt)

Пример использования фиктивных данных (обратите внимание, что для 03:00:00 и 04:00:00 нет значения):

y = np.linspace(0,3,4)
fig, ax = plt.subplots()

ax.xaxis.set_major_locator(hours)
ax.xaxis.set_major_formatter(h_fmt)
ax.plot(hhmmss_time, y)

enter image description here

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