Линейный график Matplotlib с подсчетом?

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

Это макет DF:

my = pd.DataFrame(np.array(
   [['Apple', 1], 
    ['Kiwi',  2],
    ['Clementine', 3],
    ['Kiwi', 1], 
    ['Banana',  2], 
    ['Clementine', 3],
    ['Apple',  1], 
    ['Kiwi',  2]]), 
                    columns=['fruit', 'cheers'])

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

РЕДАКТИРОВАТЬ: Линейный график не может быть лучшим занятием, пожалуйста, сообщите мне тогда. Я хотел бы что-то вроде этого: введите описание изображения здесь

В большом наборе данных может быть один, а не несколько «нулей», возможно, мне следовало бы сделать еще больший дф.

Всего 4 ответа


Приведенный ниже код построит линию для каждого «фрукта», где координата x - это количество «ура», а координата y - количество «ура» на фрукт.

Во-первых, датафрейм сгруппирован по фруктам, чтобы получить список приветствий по фруктам. Затем гистограмма рассчитывается и строится для каждого списка приветствий. Значение max_cheers_count используется для обеспечения одинаковых координат x для всех построенных линий.

Примечание: см. Ответ @ Heike ниже для более питонного решения.

import matplotlib.pyplot as plt
import numpy as np

# convert 'cheers' column to int
my.cheers = my['cheers'].astype(int)

# computes maximal cheers value, to use later for the histogram
max_cheers_count = my['cheers'].max()

# get cheer counts per fruit
cheer_counts = my.groupby('fruit').apply(lambda x: x['cheers'].values)

# for each fruit compute histogram of cheer counts and plot it
plt.figure()
for row in cheer_counts.iteritems():
    histogram = np.histogram(a=row[1], bins=range(1,max_cheers_count+2))
    plt.plot(histogram[1][:-1], histogram[0], marker='o', label=row[0])
plt.xlabel('cheers')
plt.ylabel('counts')
plt.legend()

Я вижу, вы уже приняли ответ, но альтернативный способ сделать это что-то вроде

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

my = pd.DataFrame(np.array([['Apple', 1],
                            ['Kiwi',  2],
                            ['Clementine', 3],
                            ['Kiwi', 1],
                            ['Banana',  2],
                            ['Clementine', 3],
                            ['Apple',  1],
                            ['Kiwi',  2]]),
                  columns=['fruit', 'cheers'])

my_pivot = my.pivot_table(index = 'cheers', 
                          columns = 'fruit', 
                          fill_value = 0, 
                          aggfunc={'fruit':len})['fruit']
my_pivot.plot.line()
plt.tight_layout()
plt.show()

Выход:

линейный график сводной таблицы


my.groupby('fruit').sum().plot.barh()

введите описание изображения здесь


Обратите внимание, что ваш примерный фрейм данных имеет числа, представленные в виде string типа, поэтому вы можете изменить его на int раньше, используя

my.cheers = my.cheers.astype(int)

Это из-за вашей инициализации фрейма данных через 2D-массив.
Вы можете избежать этого, используя словарный подход для создания фрейма данных:

my = pd.DataFrame(
{'fruit': ['Apple', 'Kiwi', 'Clementine', 'Kiwi', 'Banana', 'Clementine', 'Apple', 'Kiwi'],
'cheers': [1, 2, 3, 1, 2, 3, 1, 2]})

Альтернативный способ получить именно ту цифру, которую вы разместили и которая начинает кривые с 0, заключается в следующем. Идея состоит в том, чтобы посчитать частоту встречаемости каждого фрукта для разных аплодисментов, а затем использовать словари.

from collections import Counter
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# Define the dataframe here
# my = pd.DataFrame(...)

cheers = np.array(my['cheers'])

for fr in np.unique(my['fruit']):
    freqs = Counter(cheers[np.argwhere(my['fruit']==fr)].flatten()) # Count the frequency
    init_dict = {Ɔ': 0}
    init_dict.update({i: 0 for i in np.unique(cheers)}) # Initialize the dictionary with 0 values
    for k, v in freqs.items():
        init_dict[k] = v # Update the values of cheers
    plt.plot(init_dict.keys(), init_dict.values(), '-o', label=fr) # Plot each fruit line

plt.legend()
plt.yticks(range(4))
plt.show()

введите описание изображения здесь


Есть идеи?

10000