matplotlib 如何从字符串列表制作直方图

9ceoxa92  于 2023-01-31  发布在  其他
关注(0)|答案(9)|浏览(197)

我有一个字符串列表:

a = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'e', 'e', 'e', 'e', 'e']

我想做一个直方图来显示字母的频率分布。我可以用下面的代码制作一个包含每个字母计数的列表:

from itertools import groupby
b = [len(list(group)) for key, group in groupby(a)]

如何制作直方图?在列表a中可能有一百万个这样的元素。

z31licg0

z31licg01#

非常容易与Pandas

import pandas
from collections import Counter
a = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'e', 'e', 'e', 'e', 'e']
letter_counts = Counter(a)
df = pandas.DataFrame.from_dict(letter_counts, orient='index')
df.plot(kind='bar')

请注意,Counter正在进行频率计数,因此我们的绘图类型是'bar',而不是'hist'

xtupzzrd

xtupzzrd2#

以下是一个简明的全Pandas方法:

a = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'e', 'e', 'e', 'e', 'e']
pd.Series(a).value_counts(sort=False).plot(kind='bar')

fcg9iug3

fcg9iug33#

正如上面提到的@ notconblusible,这个问题可以用Pandas和Counter来解决。如果任何原因你不需要使用Pandas,你可以只使用matplotlib,使用下面代码中的函数:

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

a = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'e', 'e', 'e', 'e', 'e']
letter_counts = Counter(a)

def plot_bar_from_counter(counter, ax=None):
    """"
    This function creates a bar plot from a counter.

    :param counter: This is a counter object, a dictionary with the item as the key
     and the frequency as the value
    :param ax: an axis of matplotlib
    :return: the axis wit the object in it
    """

    if ax is None:
        fig = plt.figure()
        ax = fig.add_subplot(111)

    frequencies = counter.values()
    names = counter.keys()

    x_coordinates = np.arange(len(counter))
    ax.bar(x_coordinates, frequencies, align='center')

    ax.xaxis.set_major_locator(plt.FixedLocator(x_coordinates))
    ax.xaxis.set_major_formatter(plt.FixedFormatter(names))

    return ax

plot_bar_from_counter(letter_counts)
plt.show()

它将生成x1c 0d1x

91zkwejq

91zkwejq4#

不要使用groupby()(它需要对输入进行排序),而要使用collections.Counter();这不需要创建中间列表来计算输入:

from collections import Counter

counts = Counter(a)

你还没有真正指定你认为什么是"直方图"。让我们假设你想在终端上这样做:

width = 120  # Adjust to desired width
longest_key = max(len(key) for key in counts)
graph_width = width - longest_key - 2
widest = counts.most_common(1)[0][1]
scale = graph_width / float(widest)

for key, size in sorted(counts.items()):
    print('{}: {}'.format(key, int(size * scale) * '*'))

演示:

>>> from collections import Counter
>>> a = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'e', 'e', 'e', 'e', 'e']
>>> counts = Counter(a)
>>> width = 120  # Adjust to desired width
>>> longest_key = max(len(key) for key in counts)
>>> graph_width = width - longest_key - 2
>>> widest = counts.most_common(1)[0][1]
>>> scale = graph_width / float(widest)
>>> for key, size in sorted(counts.items()):
...     print('{}: {}'.format(key, int(size * scale) * '*'))
... 
a: *********************************************************************************************
b: **********************************************
c: **********************************************************************
d: ***********************
e: *********************************************************************************************************************

numpy.histogram()matplotlib.pyplot.hist()函数中可以找到更复杂的工具,它们可以为您进行计数,matplotlib.pyplot.hist()还提供图形输出。

mf98qq94

mf98qq945#

用麻木

使用numpy 1.9或更高版本:

import numpy as np
a = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'e', 'e', 'e', 'e', 'e']
labels, counts = np.unique(a,return_counts=True)

可使用以下公式绘制:

import matplotlib.pyplot as plt 
ticks = range(len(counts))
plt.bar(ticks,counts, align='center')
plt.xticks(ticks, labels)

wpcxdonn

wpcxdonn6#

看看matplotlib.pyplot.bar。如果你想要更宽的垃圾箱,还有numpy.histogram,它更灵活。

x33g5p2x

x33g5p2x7#

在python中制作字符直方图的简单有效方法

import numpy as np

import matplotlib.pyplot as plt

from collections import Counter



a = []
count =0
d = dict()
filename = raw_input("Enter file name: ")
with open(filename,'r') as f:
    for word in f:
        for letter  in word:
            if letter not in d:
                d[letter] = 1
            else:
                d[letter] +=1
num = Counter(d)
x = list(num.values())
y = list(num.keys())

x_coordinates = np.arange(len(num.keys()))
plt.bar(x_coordinates,x)
plt.xticks(x_coordinates,y)
plt.show()
print x,y
avwztpqn

avwztpqn8#

这是一段时间以前,所以我不知道如果你仍然需要帮助,但其他人可能会,所以我在这里。如果你被允许使用matplotlib,我认为有一个更简单的解决方案!

a = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'e', 'e', 'e', 'e', 'e']

import matplotlib.pyplot as plt
plt.hist(a) #gives you a histogram of your array 'a'
plt.show() #finishes out the plot

这应该得到你一个漂亮的柱状图!如果你喜欢,你也可以做更多的编辑来清理图表

r7s23pms

r7s23pms9#

import seaborn as sns

a = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'e', 'e', 'e', 'e', 'e']
ax = sns.countplot(x=a)

ax = sns.countplot(y=a)

ax = sns.histplot(x=a)

g = sns.displot(kind='hist', x=a)

相关问题