Я пытаюсь построить три строки с помощью matplotlib, но он отображается как один

#python #pandas #matplotlib

#python #панды #matplotlib

Вопрос:

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

     username    hour    freq
0   Player 1    0        74
1   Player 1    1        37
2   Player 1    2        6
3   Player 2    3        152
4   Player 2    5        90
5   Player 2    6        57
6   Player 3    7        219
7   Player 3    8        443
8   Player 3    9        557
 

Затем я использую этот DF и пытаюсь построить его следующим образом:

 plt.rcParams['figure.figsize'] = 10,5
for name in playername: 
    playertimes = new_df[new_df.username.isin([name])]
    plt.plot(playertimes['freq'], c='Black', ls='--', marker = 's', ms=7, label = name)
plt.legend(loc='upper left', bbox_to_anchor=(1,1))
plt.xticks(list(range(0,24)), new_df['hour'], rotation = 'vertical')
plt.show()
 

Моя логика заключается в том, что я собираюсь использовать playertimes df в качестве временного df, чтобы я мог отображать только частоту каждого игрока.

Я надеялся на одну строку для каждого игрока, но я получил следующее:

Сбой графика

Я пытался возиться с несколькими вещами, но, похоже, не могу заставить его работать. Есть идеи?

Ответ №1:

Список пользователей должен быть уникальным, чтобы проходить через фрейм данных только один раз, и фрейм данных должен быть отсортирован по «часу», чтобы отобразить результаты, как ожидалось. Чтобы отобразить правильные значения на оси x, вам просто нужно на самом деле отобразить эти значения на оси x. Приведенный ниже код включает все эти изменения:

 plt.rcParams['figure.figsize'] = 10,5
linestyles = ['-', '--', ':']
markers = ['s', 'o', 'v']
for i, name in enumerate(df.username.unique()): 
    playertimes = df[df.username.isin([name])].sort_values('hour')
    plt.plot(playertimes['hour'], playertimes['freq'], c='Black', 
ls=linestyles[i], marker =markers[i], ms=7, label = name)
plt.legend(loc='upper left', bbox_to_anchor=(1,1))
plt.xticks(range(0,24), rotation = 'vertical')
plt.show()
 

3 графика

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

1. Это был всего лишь образец данных, в фактическом DF каждый игрок сгруппирован с 0 -23, а затем в столбце Freq. Я попытался внести изменения в свой, и я все еще получаю график из своего сообщения. Интересно, почему вы все правильно поняли, а я нет.

2. Я отредактировал ответ, теперь я понимаю, в чем была ваша проблема.

3. О, это имеет смысл. Большое вам спасибо.