Линейный график Matplotlib с подсчетом? - PullRequest
1 голос
/ 17 мая 2019

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

Это фиктивная 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'])

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

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

В большом наборе данных может быть один, а не несколько "нулей", может быть, мне следовало бы сделать большую ложную df.

Ответы [ 4 ]

2 голосов
/ 17 мая 2019

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

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()

Выход:

line plot of pivot table

1 голос
/ 17 мая 2019

Альтернативный способ получить точно , за которой вы разместили фигуру, которая начинает кривые с 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': 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()

enter image description here

1 голос
/ 17 мая 2019

Код ниже построит линию для каждого «фрукта», где координата 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()
1 голос
/ 17 мая 2019
my.groupby('fruit').sum().plot.barh()

enter image description here


Обратите внимание, что ваш примерный фрейм данных имеет числа, представленные в виде 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]})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...