Как сделать гистограмму с метками в Y и с частотой рядом с барами, используя большой набор данных? - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь создать гистограмму для базы данных, насчитывающей более 56 640 слов.

Я хочу показать 200 или более часто встречающихся слов без их объединения, то есть они различимы на оси Y. Кроме того, частота каждого слова находится рядом с полосами, соответствующими каждому слову.

Я думаю, что слова связаны (и не читаются), потому что размер экрана, но я думаю, что решение для этого может быть реализовать диапазон:

  • Например: от 100 до 200 наиболее распространенных слов histogram(word_index, 100, 200).

Код:

import matplotlib.pyplot as plt
from collections import Counter

def histogram(word_list, n):
  n = n # this is necessary, otherwise the parameter will not be recognize.
  counts = dict(Counter(word_list).most_common(n))
  labels, values = zip(*counts.items())

  # sort the values in descending order
  indSort = np.argsort(values)[::-1]

  # rearrange the data
  labels = np.array(labels)[indSort]
  values = np.array(values)[indSort]

  indexes = np.arange(len(labels))

  # figure configuration
  plt.figure(figsize = (15, 4))
  bar_width = 0.35
  plt.bar(indexes, values, color = 'r')

  # add labels
  plt.xticks((indexes + bar_width), labels, rotation = 'vertical', color = 'white')
  plt.tight_layout()
  plt.show()

hitogram(word_index, 201)

Фактический выход: actual output

Ожидаемый результат:

expected output

1 Ответ

1 голос
/ 04 марта 2020

Я думаю, что проще, если вы используете plot.barh() метод из pandas Series.

from collections import Counter
import pandas as pd
text = """
Lorem ipsum dolor sit amet, aenean volutpat nam nulla ac ipsum, iaculis ultrices egestas, ac lacus fringilla ante, leo id ac conubia, sit justo suspendisse eu consectetuer. Rutrum nunc, maecenas quisque accumsan lobortis commodo sit, dui est molestie nunc imperdiet, donec condimentum justo neque ut quis, lorem aliquet enim vehicula sapien enim. Bibendum tempus faucibus dolor quis vestibulum, amet ligula sem phasellus hendrerit, ultrices voluptas per massa, arcu lectus vel, laoreet tincidunt est turpis. Senectus amet molestie est risus velit turpis, id aliquam, ipsum tristique quam phasellus purus, vel magna eget maecenas velit mattis. Felis nulla risus condimentum ipsum curabitur, curae quis, cursus ullamcorper luctus mattis ut, nunc quisque enim faucibus sem, quis feugiat purus condimentum tincidunt id. Ultricies cras fusce nunc sagittis arcu ut. Enim molestie porttitor, cras leo et. Eu bibendum adipiscing convallis etiam, velit volutpat amet accumsan non non cursus. Ut in mauris sodales leo duis, vitae aliquam accumsan posuere venenatis. Tellus ante id suspendisse, imperdiet sed at vel, ipsum magna, cum dolor curabitur, nunc omnis mauris elit. Urna quisque etiam accumsan leo, dictum massa nibh, eu laoreet. Nulla justo, consectetuer eros, ac mi condimentum purus.
Consectetuer vestibulum at, nulla per duis eget, mauris odio ac vitae, tincidunt risus tincidunt in massa nisl. Quod eu pede erat maecenas dui, suspendisse ipsum rhoncus sed purus at, dui integer nec quam. Ut et cursus, arcu ligula volutpat, et eleifend id montes bibendum metus integer. Massa urna ante sodales sodales etiam, sed a urna aliquam vitae lectus vel, aliquam tellus nulla massa sed, molestie ante ligula quam aliquet proin sed, pede pellentesque elit vel urna urna. Venenatis enim velit amet dictum. Nec enim pretium enim amet lectus sed, dignissim lectus id vel sed, qui mollis mattis pede viverra sit ipsum. Mattis massa vel accumsan, ridiculus orci, ullamcorper enim tristique aliquam eget ridiculus turpis, duis et at natus libero, non convallis sed vel molestie risus. Phasellus non amet vitae odio egestas tincidunt, urna quis etiam eros sollicitudin, quaerat pede platea maecenas aliquam et imperdiet. Curabitur volutpat fusce. Luctus massa sollicitudin venenatis litora, neque nec tortor vel donec in, mi interdum eget vestibulum, eget amet curabitur molestie gravida, mi vivamus euismod.
Dictumst augue id, justo turpis, cras eu placerat accumsan deserunt ac, volutpat quis nunc accumsan risus laoreet, proin reprehenderit. Urna nunc elit velit diam, gravida sed quis eget. Erat morbi wisi aenean amet adipiscing, ut aliquet commodo, quis odio aenean aliquam nulla augue porta, amet ante tincidunt mi ipsum tellus mollis, lacus suspendisse. Cum et est interdum velit semper pellentesque, est dui laoreet in nunc magna, quis ante volutpat duis est, ligula a ridiculus, quam pellentesque omnis pellentesque. Sodales suspendisse sed at tellus, sit aliquam proin libero, vitae sed doloribus tellus. Morbi libero ipsum, placerat amet vel, magna dignissim pellentesque velit non erat. Neque urna dolor, quam suspendisse scelerisque turpis nulla dui, tortor amet praesent quisque, senectus aliquam urna cum.
Ullamcorper mollis dapibus aenean in, nulla vivamus interdum a nam vestibulum sodales, sed amet nulla integer, luctus orci. Facilisis auctor mauris, non lorem tellus lorem, in habitasse. Ut euismod tellus eros, metus vel risus, turpis non in augue arcu, neque vivamus etiam, porttitor dui vitae sociosqu libero. Ornare ultrices etiam suspendisse, molestie fringilla hendrerit quisque tincidunt. Consectetuer pellentesque in eu nibh, tortor non at mollis suspendisse ullamcorper ipsum. Nec eu aliquam tincidunt hymenaeos nonummy mollis, id ac diam sapien felis, et est quis, ante vivamus rutrum illo feugiat vitae integer. Vestibulum nec dignissim litora, lobortis mauris ac facilisi, pede orci interdum, sagittis et, ultricies semper in sed nulla nulla eget. Amet pede, euismod consectetur, eu erat molestie tempor gravida diamlorem, pede hendrerit duis fermentum turpis in ut, placerat id urna dapibus vivamus. Lobortis turpis in tristique potenti felis amet. Id libero vitae ipsum sodales lacinia sociis, aliquam eros.
"""
words = text.split()
counts = Counter(words)
serie = pd.Series(counts) # this convert dictionary to pandas Series object
N = 50 # number of words to plot
first_N = serie.sort_values().tail(N) # sort the values (in ascending order) of the serie and select the N most frequent words
ax = first_N.plot.barh(figsize=(8, 16)) # make the horizontal bar plot, set the size of thefigure
i = 0 
xoffset = 0.1 # change this value to adjust the text label
for v in first_N.values:
    # adds the text next to each bar
    ax.text(y=i, x=v + xoffset, s=v, ha='left', va='center') 
    i += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...