Я пытаюсь построить график на питоне, который покажет мне появление элементов с течением времени. Итак, я хочу узнать, сколько предметов, соответствующих двум категориям, появляется в каждом году, и построить график на их основе.
Это мои данные в excel:
Что я хочу закончить, так это список фильмов, которые являются одновременно фэнтези и боевиками, и сколько раз они появляются в каждом году. Это конечный результат, к которому я пришел (что правильно)
то есть в 2004 году есть 2 фильма, которые являются одновременно фэнтези и боевиком, и есть один фильм 2005 года, который является одновременно фэнтези и боевиком и т. д.
Вот шаги, которые я предпринял, чтобы получить результат:
#import data:
data = pd.read_csv("data.csv")
#put all fantasy movies in a list:
fantasy_movies = data[['Name', 'Genre']][(data['Genre'] == 'Fantasy')]
fantasy_movies.rename(columns = {'Genre' : 'Fantasy'}, inplace = True)
#put all action movies in a list:
action_movies = data[['Name', 'Genre']][(data['Genre'] == 'Action')]
action_movies.rename(columns = {'Genre' : 'Action'}, inplace = True)
#merge the two datasets:
action_fantasy = pd.merge(fantasy_movies, action_movies)
#obtain a list of unique movie names:
unique = action_fantasy.Name.unique()
#make dates the column and unique names the rows
filter_data = data[(data.Name.isin(unique))]
table = filter_data.pivot_table(filter_data, index = ['Name'],columns=['year'])
#replace all NaNs with zero
table1 = table.fillna(0)
#Count items in years
table1.gt(0).astype(int).sum(axis=0)
Теперь отсюда я хотел бы сделать какой-то график (я думаю о гистограмме), используя Matplotlib, который будет иметь годы внизу и увеличиваться на сумму в соответствии с результатом table1. Я изо всех сил пытаюсь создать его, хотя технически это должно быть так же просто, как поместить данные в столбец x и данные в столбец y.
Как код из W3 Schools: https://www.w3schools.com/python/matplotlib_bars.asp
x = np.array(["A", "B", "C", "D"])
y = np.array([3, 8, 1, 10])
plt.bar(x,y)
plt.show()
Интересно, мои данные в неправильном формате? Какими будут мои оси x и y?
I wonder if my data is in the wrong format?
Не «неправильно» само по себе, но у него есть Мультииндекс, что немного неудобно и здесь не нужно. Я предлагаю избавиться от MultiIndex с помощью Series.droplevel
перед построением графика с помощью pandas/matplotlib/seaborn.
После удаления MultiIndex используйте Series.plot.bar
, который отображает значения как у относительно индекса как Икс:
counts = table1.gt(0).astype(int).sum(axis=0).droplevel(0)
# year
# 2004 2
# 2005 1
# 2011 1
# 2016 1
# 2018 2
# dtype: int64
counts.plot.bar(ylabel='total')
Если вы действительно хотите использовать plt.bar
, я предлагаю сбросить серию в DataFrame, а затем построить общий график с индексом диапазона:
counts = table1.gt(0).astype(int).sum(axis=0).droplevel(0).reset_index(name='total')
# year total
# 0 2004 2
# 1 2005 1
# 2 2011 1
# 3 2016 1
# 4 2018 2
plt.bar(counts.index, counts.total)
plt.xticks(ticks=counts.index, labels=counts.year)
plt.xlabel('year')
plt.ylabel('total')
В качестве альтернативы передайте DataFrame в sns.barplot
:
import seaborn as sns
sns.barplot(data=counts, x='year', y='total')
Отлично, большое спасибо за подсказку! Работает идеально :)