Как нарисовать гистограмму для массива в python?

#python #python-3.x

Вопрос:

У меня есть массив, который имеет разные значения, некоторые из которых являются дубликатами. Как я могу нарисовать для них гистограмму, горизонтальная ось которой является именем элемента, а вертикальная ось-номером в массиве?

 arr= ['a','a','a','b','c','b']
 

Комментарии:

1. Вам нужно изображение ASCII или вам нужен графический вывод? Знаете ли вы, как производить подсчеты?

Ответ №1:

Вы можете использовать matplotlib библиотеку для построения гистограммы непосредственно из списка. Код для этого выглядит следующим образом:

 from matplotlib import pyplot as plt

arr= ['a','a','a','b','c','b']

plt.hist(arr)
plt.show()
 

Вы можете узнать больше о функции гистограммы из matplotlib здесь: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.hist.html

Вы можете делать и другие вещи, такие как настройка цвета для графика гистограммы, изменение выравнивания и многое другое.

Ура!

Комментарии:

1. Спасибо, но из-за большого количества массивов записей, использующих эту библиотеку, они не очень читабельны. Есть ли способ решить эту проблему?

2. Из того, что вы упомянули, я полагаю, что у вас есть большие данные или распределенная среда. В этом случае вы можете использовать PySpark для анализа ваших данных в распределенной среде, получения количества уникальных элементов и построения гистограммы. Но если это просто массивы (списки в Python), вы можете использовать мульти-обработку, вам уникальных элементов в массиве путем преобразования его в набор, используя set(arr) , создать словарь, в котором эти элементы в качестве ключей и значения по умолчанию как 0, перебирать списки, обновить счетчик, и построить гистограмму из этого словаря с использованием библиотек matplotlib

Ответ №2:

Существует несколько шагов для решения этой проблемы..

Шаг 1: Вам нужно собрать данные в удобном месте. Исходя из вашего примера, хорошим вариантом было бы составить список со значениями. Для этого можно использовать функцию .count (). Конечно, возможны и другие методы.

Шаг 2: Для отображения данных вы можете использовать библиотеку, такую как matplotlib.pyplot. Это также может касаться шага 1. Но это не важно.

Если ваш вариант использования отличается. Пожалуйста, предоставьте более подробную информацию, чтобы мы могли вам лучше помочь

Комментарии:

1. Спасибо, но из-за большого количества массивов записей, использующих эту библиотеку, они не очень читабельны. Есть ли способ решить эту проблему?

2. Но если вы сначала уменьшите его, собрав информацию, как на первом шаге, будет ли это все еще слишком много для работы на шаге 2?

Ответ №3:

Обратите внимание, что matplotlib hist плохо работает со строковыми данными (см. Позиции баров/тиков).:

 import matplotlib.pyplot as plt

plt.hist(arr)
 

Конечно, это можно исправить вручную, но проще использовать панд или сиборна. Оба используют matplotlib под капотом, но они обеспечивают лучшее форматирование по умолчанию.

Также:

  • Если в рамке по умолчанию слишком много полос, чтобы удобно поместиться, вы можете расширить figsize ее . В этих примерах, которые я привел figsize=(6, 3) .
  • Если вы хотите повернуть x галочки, добавьте plt.xticks(rotation=90) .

панды

  • панд value_counts и plot.bar
     import pandas as pd
    
    pd.value_counts(arr).plot.bar(figsize=(6, 3))
    # pd.Series(arr).value_counts().plot.bar(figsize=(6, 3))
     


сиборн

  • сиборн histplot
     import seaborn as sns
    import matplotlib.pyplot as plt
    
    fig, ax = plt.subplots(figsize=(6, 3))
    sns.histplot(arr, ax=ax)
     

  • сиборн countplot
     import seaborn as sns
    import matplotlib.pyplot as plt
    
    fig, ax = plt.subplots(figsize=(6, 3))
    sns.countplot(arr, ax=ax)
     


matplotlib

  • collections.Counter с помощью matplotlib bar
     from collections import Counter
    
    counts = Counter(arr)
    fig, ax = plt.subplots(figsize=(6, 3))
    ax.bar(counts.keys(), counts.values())
     

  • numpy unique с matplotlib bar
     import numpy as np
    
    uniques, counts = np.unique(arr, return_counts=True)
    fig, ax = plt.subplots(figsize=(6, 3))
    ax.bar(uniques, counts)
     

Ответ №4:

Для числовых данных используются гистограммы. Ваши строковые данные (категориальные) было бы лучше использовать гистограмму. Вот код для создания гистограммы с matplotlib :

 import matplotlib.pyplot as plt
from collections import Counter
arr= ['a', 'a', 'a', 'b', 'c', 'b']
data = Counter(arr)
plt.bar(data.keys(), data.values())
plt.show()
 

штрих-карта

Несмотря на то, что гистограмма и гистограмма в этом случае выглядят одинаково, с помощью гистограммы вы можете получить неожиданный результат, например, если требуется определенное количество ячеек.