#python #pandas #matplotlib #plot
Вопрос:
Моя цель-построить линии, которые представляют определенные дни года. Примечание: Я не хочу использовать пакет, такой как дата и время-я просто пытаюсь сделать это с точками данных в виде целых значений. Таким образом, на приведенном ниже графике событие при y=3 длится со 123 по 189 день, а событие при y=2 длится с 214 по 365 день.
Где я сталкиваюсь с проблемами, так это с событием при y=1, которое должно проходить с 205-го по 22-й день (это то, что data
находится в кадре данных). Однако сюжет не знает, что я строю дни года (очевидно), и поэтому он растягивается с 0-го по 205-й день, что неверно. Вместо этого он должен начинаться с 205, тянуться вправо, а затем заканчиваться значением 22. Я нарисовал от руки синим цветом, как это должно выглядеть.
Помочь?
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data = pd.DataFrame(np.array([[3,123,189],[2,214,365],[1,205,22]]), columns=['name','start','end'])
plt.hlines(data['name'],data['start'],data['end'],linewidth=1)
plt.xlabel('Date')
plt.ylabel('Event')
Комментарии:
1. Проще всего сделать два события 1: [1, 205, 365] и [1, 1, 22]. Если вы собираетесь автоматизировать это, вам нужно только проверить, если начало > конец.
2. У меня есть 1000 строк данных, так что, если бы вы могли дать какой-нибудь псевдокод, это было бы полезно!
Ответ №1:
Как насчет этого
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data = pd.DataFrame(np.array([[3,123,189],[2,214,365],[1,205,22]]), columns=['name','start','end'])
endstart = (data.index[data['start'] > data['end']].tolist())
startend = ([i for i in range(len(data)) if i not in endstart])
fig, ax = plt.subplots()
# plot startend
ax.hlines(data['name'][startend],data['start'][startend],data['end'][startend],linewidth=1)
# plot endstart
ax.hlines(data['name'][endstart],data['start'][endstart],365,linewidth=1)
ax.hlines(data['name'][endstart],0,data['end'][endstart],linewidth=1)
ax.set_xlabel('Date')
ax.set_ylabel('Event')
Выход:
Комментарии:
1. Мне просто нужно было внести следующее изменение, и тогда код сработал: startend = ([i для i в (data.index), если я не в конце])