Гистограмма Matplotlib для количества вхождений - PullRequest
0 голосов
/ 17 апреля 2020

Я хочу сделать гистограмму для числа вхождений в списке. Более конкретно, я начинаю со списка вроде:

>>> print(some_list)
[2, 3, 10, 5, 20, 34, 50, 10, 10 ... ]

Этот список в основном целые числа в диапазоне [0, 2470]. То, что я хочу сделать, это построить график числа вхождений для каждого целого числа. Код, который я написал:

from collections import Counter

import matplotlib.pyplot as plt
import pandas as pd


sorted_list = sorted(some_list)
sorted_counted = Counter(sorted_list)

range_length = list(range(max(some_list))) # Get the largest value to get the range.
data_series = {}

for i in range_length:
    data_series[i] = 0 # Initialize series so that we have a template and we just have to fill in the values.

for key, value in sorted_counted.items():
    data_series[key] = value

data_series = pd.Series(data_series)
x_values = data_series.shape[0]

plt.bar(x_values, data_series.values)
plt.show()

Когда я запускаю этот код, я получаю следующий график:

enter image description here

, который не не то, что я ищу.

График, который я ожидаю, имеет значения $ x $, значения в [0, 2740], а значения $ y $ должны быть числом вхождений для каждое целое значение. Он должен выглядеть как перевернутый экспоненциальный граф.

В чем проблема с моим кодом? Заранее спасибо.

1 Ответ

1 голос
/ 17 апреля 2020

Строка x_values = data_series.shape[0] вызывает проблемы: это превращает ваши значения x_values ​​в первое измерение data_series (одно значение), а это не то, что вам нужно. Вместо этого попробуйте x_values = data_series.index, который даст вам список всех целых чисел вплоть до самого высокого встречающегося.

Чтобы показать, что это обобщается, вот что я получил, используя распределение Пуассона.

from collections import Counter

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

some_list = np.random.poisson(500, 2470).tolist()

sorted_list = sorted(some_list)
sorted_counted = Counter(sorted_list)

range_length = list(range(max(some_list))) # Get the largest value to get the range.
data_series = {}

for i in range_length:
    data_series[i] = 0 # Initialize series so that we have a template and we just have to fill in the values.

for key, value in sorted_counted.items():
    data_series[key] = value

data_series = pd.Series(data_series)
x_values = data_series.index

# you can customize the limits of the x-axis
# plt.xlim(0, max(some_list))
plt.bar(x_values, data_series.values)

plt.show() 

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...