#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
с помощью matplotlibbar
from collections import Counter counts = Counter(arr) fig, ax = plt.subplots(figsize=(6, 3)) ax.bar(counts.keys(), counts.values())
- numpy
unique
с matplotlibbar
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()
Несмотря на то, что гистограмма и гистограмма в этом случае выглядят одинаково, с помощью гистограммы вы можете получить неожиданный результат, например, если требуется определенное количество ячеек.