Matplotlib折线图计数吗?

时间:2019-05-17 07:26:35

标签: python matplotlib

我正在尝试绘制一个大型数据集的折线图,我想将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'])

我希望情节使用“欢呼声”作为x,然后为每个“水果”和“欢呼声”的次数写一行

编辑:折线图可能不是最好的选择,然后请告诉我。我想要这样的东西: enter image description here

在大数据集中可能只有一个,但没有几个“零”,也许我应该做一个更大的模拟df。

4 个答案:

答案 0 :(得分:2)

我看到您已经接受了答案,但是另一种替代方法是

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 :(得分:1)

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]})

答案 2 :(得分:1)

下面的代码将为每个“水果”绘制一条线,其中x坐标是“欢呼声”的数量,y坐标是每个水果的欢呼声计数。

首先,将数据帧按水果分组以获取每个水果的欢呼声列表。接下来,为每个欢呼声列表计算并绘制直方图。使用max_cheers_count是为了确保所有绘制线的x坐标相同。

注意:请参阅下面的@Heike答案,以获得更多的pythonic解决方案。

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

答案 3 :(得分:1)

以下是获取精确您发布的图形(从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