Сложенная линейчатая диаграмма из Dataframe с использованием группировки - PullRequest
2 голосов
/ 27 июня 2019

У меня есть следующий фрейм данных, и я пытаюсь создать столбчатую диаграмму импорта импорта из pprint import pprint import matplotlib.pyplot как plt import pandas как pd

def classify_data():
    race = ['race1','race1','race1','race1','race2','race2','race2', 'race2']
    qualifier = ['last','first','first','first','last','last','first','first']
    participant = ['rat','rat','cat','cat','rat','dog','dog','dog']
    df = pd.DataFrame(
        {'race':race,
         'qualifier':qualifier,
         'participant':participant

        }
    )
    pprint(df)
    df2 = df.groupby(['race','qualifier'])['race'].count().unstack('qualifier').fillna(0)
    df2[['first','last']].plot(kind='bar', stacked=True)
    plt.show()



classify_data()

Мне удалось получить следующеесюжет.Но я хочу создать два графика из моего фрейма данных

Один график, содержащий следующие данные для классификатора 'last'

Race1 rat 1
Race1 cat 0
Race1 dog 0 
Race2 rat 1
Race2 dog 1
Race2 cat 0

Таким образом, первый столбчатый график будет иметь 2 бара и каждыйполоса с другим цветом для счетчика participant

Аналогично, второй график для квалификатора 'first'

РЕДАКТИРОВАТЬ:

  Race1 rat 1
  Race1 cat 2
  Race1 dog 0 
  Race2 rat 0
  Race2 dog 2
  Race2 cat 0

Из исходного кадра данных,Мне нужно создать два вышеупомянутых кадра данных для создания составных графиков plot

Я не уверен, как использовать функцию groupby и получить количество «участника» для каждого квалификатора.для данной «расы»

РЕДАКТИРОВАТЬ 2: Для квалификатора «последний» желаемый сюжет будет выглядеть (синий для крысы, красный для собаки).

enter image description here

Для квалификации 'first'

enter image description here

Может кто-нибудь подсказать мне, как поступить отсюда?

1 Ответ

0 голосов
/ 27 июня 2019

IIUC, это то, что вы хотите:

df2 = (df.groupby(['race','qualifier','participant'])
         .size()
         .unstack(level=-1)
         .reset_index()
      )

fig,axes = plt.subplots(1,2,figsize=(12,6),sharey=True)
for ax,q in zip(axes.ravel(),['first','last']):
    tmp_df = df2[df2.qualifier.eq(q)]
    tmp_df.plot.bar(x='race', ax=ax, stacked=True)

Выход:

enter image description here

...