Skip to content

7. Столбчатые диаграммы (Bar Charts): Вертикальный и горизонтальный анализ ​

Построение дискретных столбчатых диаграмм ​

Инженерный смысл диаграмм Bar Charts ​

В отличие от гистограмм (ax.hist()), которые группируют непрерывные числовые значения в частотные корзины, столбчатые диаграммы предназначены для отображения величин, привязанных к дискретным категориям.

В ИИ-инженерии и анализе данных столбчатые диаграммы используются для визуализации метрик по различным классам (например, сравнение Accuracy моделей разных архитектур), отображения количества токенов или ранжирования вклада признаков.

В Matplotlib для этого реализованы два базовых метода объекта координатной сетки (Axes):

  • ax.bar(x, height) — строит вертикальную столбчатую диаграмму, где x задает позиции или названия категорий, а height — высоту столбцов.
  • ax.barh(y, width) — строит горизонтальную столбчатую диаграмму, где y задает позиции категорий, а width — ширину (длину) столбцов.

Кастомизация подписей шкал и делений ​

При работе с текстовыми категориями часто требуется вручную зафиксировать и настроить подписи шкал делений (ticks), чтобы элементы текста не перекрывали друг друга. Для управления делениями на C-уровне используются методы ax.set_xticks(positions) и ax.set_xticklabels(labels) (а также их зеркальные аналоги для оси Y — set_yticks и set_yticklabels).

python
import matplotlib.pyplot

fig, ax = matplotlib.pyplot.subplots()

models_list = ["ResNet", "VGG", "ViT"]
accuracy_scores = [0.85, 0.72, 0.94]

# Drawing vertical columns chart
ax.bar(models_list, accuracy_scores, color="teal")
ax.grid(True)

Практика Feature Importance: Горизонтальный анализ для бизнеса ​

Почему вертикальные столбики не подходят для текстовых фичей ​

В реальных задачах машинного обучения (например, при использовании алгоритмов Random Forest или Gradient Boosting) модель после обучения выдает вектор важности признаков (Feature Importance). Этот вектор показывает, какой вклад внесла каждая колонка датасета в итоговое предсказание.

Обычно признаков в таблице много (десятки или сотни), и они имеют длинные текстовые названия (например, "feature_average_daily_income"). Если попытаться вывести их на стандартном вертикальном графике ax.bar(), текст на оси X превратится в абсолютно нечитаемую «кашу» из накладывающихся друг на друга букв.

Переход к горизонтальным диаграммам ax.barh() для ТОП-15 параметров ​

В промышленной разработке для демонстрации важности фичей бизнесу применяется строгий стандарт:

  1. Данные сортируются по убыванию важности.
  2. Массив жестко обрезается (срезается) до ТОП-15 самых важных признаков, чтобы не загромождать холст.
  3. График строится с помощью метода ax.barh(). При горизонтальной ориентации длинные текстовые названия признаков располагаются слева и читаются человеком естественно (слева направо), а длина полосы наглядно отражает вес фичи.
python
import matplotlib.pyplot

fig, ax = matplotlib.pyplot.subplots(figsize=(10, 6))

top_features_names = ["income_scaled", "user_age", "city_id", "device_type"]
importance_weights = [0.45, 0.32, 0.12, 0.05]

# Drawing a clear, readable horizontal bars layout chart
ax.barh(top_features_names, importance_weights, color="royalblue")

# Inverting y-axis so the most important feature stays on very top
ax.invert_yaxis()
ax.set_xlabel("Importance Absolute Score")
ax.grid(True)

Упражнения базовые (5 шт) (только с опорой на объясненную в данном уроке теорию) ​

1. Построение базового вертикального бар-чарта ​

Задача: Даны названия трех классов ["cat", "dog", "bird"] и количество объектов в выборке [150, 300, 45]. Постройте вертикальную столбчатую диаграмму, окрасив столбики в серый цвет ("gray"). Включите координатную сетку.

Посмотреть решение
python
import matplotlib.pyplot

classes_labels = ["cat", "dog", "bird"]
samples_counts = [150, 300, 45]

# Instantiating a basic vertical bars chart layout node
fig, ax = matplotlib.pyplot.subplots()
ax.bar(classes_labels, samples_counts, color="gray")
ax.grid(True)

2. Построение базовой горизонтальной диаграммы ​

Задача: На основе данных из предыдущего упражнения постройте горизонтальную столбчатую диаграмму с помощью метода ax.barh(). Окрасьте полосы в темно-синий цвет ("navy").

Посмотреть решение
python
import matplotlib.pyplot

classes_labels = ["cat", "dog", "bird"]
samples_counts = [150, 300, 45]

# Activating horizontal bars layout plot execution
fig, ax = matplotlib.pyplot.subplots()
ax.barh(classes_labels, samples_counts, color="navy")
ax.grid(True)

3. Инвертирование оси для ранжированного списка ​

Задача: При построении горизонтального графика метод ax.barh() располагает первый элемент списка в самом низу оси Y. Нарисуйте горизонтальный бар-чарт по спискам names = ["f1", "f2"], values = [10, 20]. Сразу после отрисовки вызовите метод ax.invert_yaxis(), чтобы инвертировать ось и поднять элемент "f1" на верхнюю позицию.

Посмотреть решение
python
import matplotlib.pyplot

names = ["f1", "f2"]
values = [10, 20]

fig, ax = matplotlib.pyplot.subplots()
ax.barh(names, values)

# Flipping the vertical coordinate index order direction directly
ax.invert_yaxis()
ax.grid(True)

4. Текстовое аннотирование столбчатой диаграммы ​

Задача: Постройте вертикальную диаграмму сравнения метрик моделей. Снабдите её текстовым контекстом: заголовок "Model Validation Metrics Accuracy", подпись горизонтальной оси X — "Architecture Framework", подпись вертикальной оси Y — "Accuracy Score".

Посмотреть решение
python
import matplotlib.pyplot

frameworks = ["PyTorch", "TensorFlow", "JAX"]
scores = [0.95, 0.88, 0.91]

fig, ax = matplotlib.pyplot.subplots()
ax.bar(frameworks, scores)

# Attaching text strings metadata to specific titles labels sub-nodes
ax.set_title("Model Validation Metrics Accuracy")
ax.set_xlabel("Architecture Framework")
ax.set_ylabel("Accuracy Score")
ax.grid(True)

5. Подавление бэкенд-логов вывода bar-объектов ​

Задача: Метод ax.bar() возвращает служебный контейнер объектов типа BarContainer. Из-за этого в Jupyter над холстом выводится блок лишнего системного текста. Напишите вызов отрисовки столбцов, заблокировав этот вывод с помощью точки с запятой ;.

Посмотреть решение
python
import matplotlib.pyplot

fig, ax = matplotlib.pyplot.subplots()

# Semicolon blocks text log outputs inside interactive execution tabs
ax.bar(["A", "B"], [10, 20], color="orange");

Упражнения смешанные (5 шт) (включают материал прошлых уроков) ​

6. Горизонтальный анализ Feature Importance из таблицы Pandas в Headless-режиме ​

Задача: Модель Random Forest выдала несбалансированную таблицу важности признаков: df_importance = pandas.DataFrame({"feature_name": ["user_age", "device_type", "average_check_amount", "city_id", "session_duration_sec"], "importance": [0.12, 0.05, 0.45, 0.08, 0.30]}) (Урок 5 модуля Pandas). Отсортируйте полученный датасет по значениям в столбце "importance" строго по возрастанию на месте (Урок 4 модуля Pandas). Настройте Matplotlib для работы без графического интерфейса (Урок 3 модуля Matplotlib). Создайте холст размером (10, 5) (Урок 2 модуля Matplotlib). Постройте горизонтальную столбчатую диаграмму ax.barh(), выводящую важность фичей, чтобы длинные текстовые названия читались слева направо (Урок 7 модуля Matplotlib). Добавьте подписи осей и сохраните отчет в файл "feature_importance.png" (Урок 3 / Урок 4 модуля Matplotlib).

Посмотреть решение
python
import matplotlib
# Locking non-interactive backend configuration before drawing tasks (Lesson 3)
matplotlib.use('Agg')
import matplotlib.pyplot
import pandas

df_importance = pandas.DataFrame({"feature_name": ["user_age", "device_type", "average_check_amount", "city_id", "session_duration_sec"], "importance": [0.12, 0.05, 0.45, 0.08, 0.30]})

# Step 1: Sort weights ascending so barh draws highest values on top automatically (Pandas Lesson 4)
df_importance.sort_values(by="importance", ascending=True, inplace=True)

# Step 2: Establish Explicit Canvas Environment (Matplotlib Lesson 2)
fig, ax = matplotlib.pyplot.subplots(figsize=(10, 5))

# Step 3: Plotting horizontal bars map using pandas data targets (Matplotlib Lesson 7)
ax.barh(df_importance["feature_name"], df_importance["importance"], color="darkblue")

ax.set_title("Random Forest Classifier Feature Importance Weight")
ax.set_xlabel("Relative Importance Score Value")
ax.set_ylabel("Feature Name Reference")
ax.grid(True)

# Exporting clean binary matrix data stream to disk block (Matplotlib Lesson 3)
fig.savefig("feature_importance.png")

7. Рендеринг ТОП-3 признаков из CSV-файла после очистки дубликатов ​

Задача: Загрузите текстовый файл "logs_metrics.csv", ограничив загрузку столбцами ["metric_name", "score_val"] через параметр usecols (Урок 8 модуля Pandas). Удалите из таблицы полностью идентичные строки-дубликаты (Урок 9 модуля Pandas). Отсортируйте датасет по столбцу "score_val" по убыванию на месте (Урок 4 модуля Pandas). Выделите из таблицы ТОП-3 лучших показателей, применив срез позиционных строк .iloc[0:3] (Урок 6 модуля Pandas). В неинтерактивном режиме постройте вертикальную диаграмму полученных топ-метрик (Урок 3 / Урок 7 модуля Matplotlib). Проведите горизонтальную реперную линию на уровне y=0.90 фиолетовым пунктиром, обозначив её как "Production Baseline" (Урок 4 модуля Matplotlib). Сохраните в "top_metrics.png".

Посмотреть решение
python
import pandas
import matplotlib
# Headless context block setup initialization (Lesson 3)
matplotlib.use('Agg')
import matplotlib.pyplot

# Ingesting raw table tracks (Pandas Lesson 8)
raw_df = pandas.read_csv(filepath_or_buffer="logs_metrics.csv", usecols=["metric_name", "score_val"])

# Cleansing records duplication anomalies (Pandas Lesson 9)
raw_df.drop_duplicates(inplace=True)

# Rranking and slicing top entries frames (Pandas Lessons 4 & 6)
raw_df.sort_values(by="score_val", ascending=False, inplace=True)
top_three_df = raw_df.iloc[0:3]

fig, ax = matplotlib.pyplot.subplots()

# Building columns block charts components (Matplotlib Lesson 7)
ax.bar(top_three_df["metric_name"], top_three_df["score_val"], color="purple")

ax.set_title("Top Validated Architecture Metrics Evaluations")
ax.set_ylabel("Evaluation Score Range")

# Overlaying target performance horizontal indicator line (Matplotlib Lesson 4)
ax.axhline(y=0.90, color="violet", linestyle="--", label="Production Baseline")
ax.legend()
ax.grid(True)

fig.savefig("top_metrics.png")

8. Столбчатая диаграмма распределения классов из Parquet-файла после заполнения NaN ​

Задача: Загрузите бинарный колоночный файл данных "inference_labels.parquet" (Урок 8 модуля Pandas). В нем содержится столбец "predicted_class" типа numpy.int8 с пропущенными полями NaN (Урок 4 модуля NumPy / Урок 9 модуля Pandas). Заполните все пропуски константой -1 на месте (Урок 9 модуля Pandas). Посчитайте количество вхождений каждого уникального класса (для этого примените метод подсчета значений df["predicted_class"].value_counts(), который вернет Series, где индексами будут ID классов, а значениями — их частота). Настройте headless-режим (Урок 3). Постройте вертикальную столбчатую диаграмму, где по оси X будут индексы полученного Series, а по оси Y — его значения (Урок 7 модуля Matplotlib). Сохраните в "labels_frequency.png".

Посмотреть решение
python
import pandas
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot

# Parsing parquet data streams (Pandas Lesson 8)
labels_df = pandas.read_parquet(path="inference_labels.parquet")

# Patching empty omission signals arrays placeholders (Pandas Lesson 9)
labels_df["predicted_class"].fillna(-1, inplace=True)

# Computing frequency value counts distribution series (Pandas Lesson 2)
class_distribution = labels_df["predicted_class"].value_counts()

fig, ax = matplotlib.pyplot.subplots()

# Index properties map to categories axis, values map to column height metrics (Matplotlib Lesson 7)
ax.bar(class_distribution.index.astype(str), class_distribution.values, color="seagreen")

ax.set_title("Inference Class Distribution Frequency Log")
ax.set_xlabel("Categorical Class Code ID")
ax.set_ylabel("Total Samples Instance Counts")
ax.grid(True)

fig.savefig("labels_frequency.png")

9. Горизонтальный бар-чарт из подматрицы сгенерированного диапазона NumPy ​

Задача: Сгенерируйте одномерную последовательность из 4 элементов от 1.0 до 4.0 через numpy.linspace(1.0, 4.0, 4) (Урок 3 модуля NumPy). Оберните её в столбец "score" таблицы pandas.DataFrame (Урок 5 модуля Pandas). Добавьте текстовый столбец признаков df["feature"] = ["param_X", "param_Y", "param_Z", "param_W"] через прямое присваивание ключа (Урок 7 модуля Pandas). Извлеките срез последних двух строк таблицы с помощью позиционного оператора .iloc[-2:] (Урок 6 модуля Pandas). В неинтерактивном режиме постройте горизонтальную столбчатую диаграмму, выводящую значения "score" по категориям "feature" из полученной подматрицы (Урок 6 модуля Matplotlib). Сохраните результат в файл "sub_barh.png".

Посмотреть решение
python
import numpy
import pandas
import matplotlib
# Initializing non-interactive hardware thread configurations (Lesson 3)
matplotlib.use('Agg')
import matplotlib.pyplot

# Generating underlying arrays matrices layers (NumPy Lesson 3 & Pandas Lesson 5)
numpy_vector = numpy.linspace(1.0, 4.0, 4)
dataset_df = pandas.DataFrame({"score": numpy_vector})

# Appending explicit feature header strings tracking labels (Pandas Lesson 7)
dataset_df["feature"] = ["param_X", "param_Y", "param_Z", "param_W"]

# Extracting sub-matrix slice rows indices (Pandas Lesson 6)
sub_df_slice = dataset_df.iloc[-2:]

fig, ax = matplotlib.pyplot.subplots()

# Routing separated rows vectors paths to a horizontal bar element (Matplotlib Lesson 7)
ax.barh(sub_df_slice["feature"], sub_df_slice["score"], color="crimson")
ax.grid(True)

fig.savefig("sub_barh.png")

10. Поиск и раскрытие спецификаций API методов столбчатых диаграмм в Jupyter ​

Задача: Напишите строку кода для выполнения в ячейке Jupyter Notebook, которая открывает интерактивную Docstring-инструкцию по встроенному методу построения горизонтальных диаграмм matplotlib.axes.Axes.barh с помощью символа интроспекции (Урок 1 модуля NumPy / Урок 1 модуля Pandas).

Посмотреть решение
python
import matplotlib.axes

# Running this cell evaluation line pulls up the complete barh functional specifications guide
?matplotlib.axes.Axes.barh