#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. Я улучшил свой вопрос, пожалуйста, посмотрите на воспроизводимый пример. Большое спасибо