Как заставить линии в графике matplotlib продолжать движение после ограничения по оси x (python)

#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), если я не в конце])