Постройте вертикальную линию, используя matplotlib в моем графике

#python #matplotlib

Вопрос:

У меня есть следующая проблема. У меня есть эти данные:

 import pandas as pd, numpy as np

data = pd.DataFrame(
    {
        "year": [2000, 2001, 2001, 2001, 2002, 2003, 2004, 2005, 2006, 2007],
        "week": [0, 1, 2, 2, 3, 3, 4, 5, 6, 7],
        "value": [8, 1, 53, 2, 55, 3, 4, 55, 60, 76],
    }
)

 

Затем я строю данные week_groups = data.groupby([data["year"], data["week"]])["value"].count()

Теперь я хотел бы добавить вертикальную линию в (2004, 4). Я пытаюсь plt.axvline(x=(2004, 4)) , но у меня ошибка ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() .

Это тоже не помогает:

 plt.axvline(data["year"][np.where(np.array(data["year"]) == 2004)[0][0]])
week_groups.plot(kind="bar", figsize=(10, 5))
plt.show()
 

Как я могу это исправить, пожалуйста?

Комментарии:

1. Вы должны указать индекс (2020,20) для x, так как (2020,20) — это только метка галочки

2. Попробуй plt.axvline(x=str((2020, 20)))

3. спасибо за ответ. @CrynetOmega как я могу это сделать, пожалуйста?

4. @ShaunHan не помогает. Он просто поместил строку в первый индекс, который равен (2012, 13)

Ответ №1:

Это может помочь.

 # coding: utf-8
import pandas as pd
from matplotlib import pyplot as plt

data = pd.DataFrame(
    {
        "year": [2000, 2001, 2001, 2001, 2002, 2003, 2004, 2005, 2006, 2007],
        "week": [0, 1, 2, 2, 3, 3, 4, 5, 6, 7],
        "value": [8, 1, 53, 2, 55, 3, 4, 55, 60, 76],
    }
)

week_groups = data.groupby([data["year"], data["week"]])["value"].count()

for i in range(len(week_groups.index)):
    if week_groups.index[i] == (2004,4):
        plt.axvline(i, color='skyblue')
# Apparently, i can only solve this by a for loop. 
# Tried every other indexing method. But, no avail. 
# If any one can come up with a shorter / better code, you are welcome.
week_groups.plot(kind="bar", figsize=(10, 5))
plt.show()
 

Вывод ниже:

Выход

Комментарии:

1. Мило! вот один лайнер: plt.axvline([i for i in range(len(week_groups)) if week_groups.index[i]==(2004,4)][0], color='skyblue')

Ответ №2:

Я не знаю точно, как структурирован ваш объект groupby, поэтому я написал небольшой пример, в котором показано, как получить определенный индекс из набора данных и построить на его основе вертикальную линию.

 import pandas as pd, numpy as np

data = {
  "year": [2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007],
  "week": [0, 1, 2, 3, 4, 5, 6, 7]
}
plt.axvline(data['year'][np.where(np.array(data['year']) == 2004)[0][0]])
plt.plot(data['year'], data['week'])
 

Комментарии:

1. Я улучшил свой вопрос, пожалуйста, посмотрите на воспроизводимый пример. Большое спасибо