Форматирование графиков с денежными значениями с помощью Matplotlib

MatplotlibMatplotlibBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

При визуализации финансовых данных крайне важно правильно форматировать оси с использованием денежных знаков. Matplotlib - это мощная библиотека Python для создания визуализаций, но по умолчанию она не отображает денежные знаки на осях.

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

Советы по виртуальной машине (VM)

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

click-notebook

Вам может потребоваться подождать несколько секунд, пока Jupyter Notebook загрузится. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

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

Настройка библиотек и создание примерных данных

В этом первом шаге мы импортируем необходимые библиотеки и создадим примерные финансовые данные для нашего графика. Нам нужно импортировать как Matplotlib для визуализации, так и NumPy для генерации данных.

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

## Import necessary libraries
import matplotlib.pyplot as plt
import numpy as np

## Display plots inline in the notebook
%matplotlib inline

print("Libraries imported successfully!")

После запуска кода (нажмите Shift+Enter) вы должны увидеть следующий вывод:

Libraries imported successfully!
libraries-imported

Теперь давайте создадим некоторые примерные финансовые данные для визуализации. Финансовые данные часто представляют значения в течение времени, поэтому мы создадим простой набор данных, который может представлять ежедневную выручку за определенный период.

В новой ячейке добавьте и запустите следующий код:

## Set a random seed for reproducibility
np.random.seed(42)

## Generate financial data: 30 days of revenue data
days = np.arange(1, 31)
daily_revenue = np.random.uniform(low=1000, high=5000, size=30)

print("Sample of daily revenue data (first 5 days):")
for i in range(5):
    print(f"Day {days[i]}: ${daily_revenue[i]:.2f}")

После запуска этого кода вы увидите данные о выручке за первые 5 дней нашего примера:

Sample of daily revenue data (first 5 days):
Day 1: $3745.40
Day 2: $3992.60
Day 3: $2827.45
Day 4: $4137.54
Day 5: $1579.63

Эти примерные данные представляют ежедневные значения выручки от $1000 до $5000 за период в 30 дней. Мы будем использовать эти данные для создания нашего графика на следующем шаге.

Создание базового финансового графика

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

В новой ячейке вашего блокнота добавьте и запустите следующий код:

## Create a figure and axes
fig, ax = plt.subplots(figsize=(10, 6))

## Plot the daily revenue data
ax.plot(days, daily_revenue, marker='o', linestyle='-', color='blue', linewidth=2, markersize=6)

## Add labels and title
ax.set_xlabel('Day', fontsize=12)
ax.set_ylabel('Revenue', fontsize=12)
ax.set_title('Daily Revenue Over 30 Days', fontsize=14, fontweight='bold')

## Add grid for better readability
ax.grid(True, linestyle='--', alpha=0.7)

## Display the plot
plt.tight_layout()
plt.show()

print("Basic plot created successfully!")

После запуска этого кода вы должны увидеть линейный график, показывающий тенденцию ежедневной выручки. Он должен выглядеть приблизительно так (фактические значения могут немного отличаться из - за случайной генерации):

Basic Revenue Plot

Давайте разберем, что мы сделали в этом коде:

  1. fig, ax = plt.subplots(figsize=(10, 6)) - Создали фигуру и оси размером 10×6 дюймов
  2. ax.plot(days, daily_revenue, ...) - Построили наш график с днями по оси X и выручкой по оси Y
  3. ax.set_xlabel(), ax.set_ylabel(), ax.set_title() - Добавили подписи и заголовок к нашему графику
  4. ax.grid() - Добавили сетку, чтобы данные были легче читать
  5. plt.tight_layout() - Подкрепили отступы, чтобы все было расположено красиво
  6. plt.show() - Отобразили график

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

Форматирование меток оси Y с использованием знаков доллара

Теперь, когда у нас есть базовый график, давайте отформатируем метки оси Y так, чтобы они отображали знаки доллара. Это сделает наши финансовые данные более читаемыми и профессионально выглядящими.

Для форматирования делений на оси Y мы будем использовать модуль ticker библиотеки Matplotlib, который предоставляет различные варианты форматирования. В частности, мы воспользуемся классом StrMethodFormatter для создания настраиваемого форматтера для нашей оси Y.

В новой ячейке вашего блокнота добавьте и запустите следующий код:

## Import the necessary module for formatting
import matplotlib.ticker as ticker

## Create a figure and axes
fig, ax = plt.subplots(figsize=(10, 6))

## Plot the daily revenue data
ax.plot(days, daily_revenue, marker='o', linestyle='-', color='blue', linewidth=2, markersize=6)

## Format y-axis with dollar signs
formatter = ticker.StrMethodFormatter('${x:,.2f}')
ax.yaxis.set_major_formatter(formatter)

## Add labels and title
ax.set_xlabel('Day', fontsize=12)
ax.set_ylabel('Revenue ($)', fontsize=12)
ax.set_title('Daily Revenue Over 30 Days', fontsize=14, fontweight='bold')

## Add grid for better readability
ax.grid(True, linestyle='--', alpha=0.7)

## Display the plot
plt.tight_layout()
plt.show()

print("Plot with dollar-formatted y-axis created!")

После запуска этого кода вы должны увидеть новый график с знаками доллара на метках оси Y.

Давайте объясним ключевую часть этого кода:

formatter = ticker.StrMethodFormatter('${x:,.2f}')
ax.yaxis.set_major_formatter(formatter)

Вот что делает эта строка форматирования:

  • $ - Добавляет знак доллара в начале каждой метки
  • {x:,.2f} - Форматирует число следующим образом:
    • , - Использует запятую как разделитель тысяч (например, 1 000 вместо 1000)
    • .2f - Округляет число до двух знаков после запятой (например, $1 234,56)

Этот форматтер применяется ко всем основным делениям на оси Y. Обратите внимание, как график теперь четко показывает, что значения даны в долларах, что делает его гораздо более подходящим для визуализации финансовых данных.

Улучшение графика для более эффективной визуализации финансовых данных

Теперь, когда у нас есть базовое форматирование денежных значений, давайте дальнейшим образом улучшим наш график, чтобы он стал более полезным для анализа финансовых данных. Мы внесем несколько усовершенствований:

  1. Горизонтальную линию, показывающую среднюю ежедневную выручку
  2. Аннотации, выделяющие дни с максимальной и минимальной выручкой
  3. Настроенные параметры делений для лучшей читаемости
  4. Более описательный заголовок и легенду

В новой ячейке вашего блокнота добавьте и запустите следующий код:

## Import the necessary module for formatting
import matplotlib.ticker as ticker

## Create a figure and axes
fig, ax = plt.subplots(figsize=(12, 7))

## Plot the daily revenue data
ax.plot(days, daily_revenue, marker='o', linestyle='-', color='blue',
        linewidth=2, markersize=6, label='Daily Revenue')

## Calculate statistics
avg_revenue = np.mean(daily_revenue)
max_revenue = np.max(daily_revenue)
min_revenue = np.min(daily_revenue)
max_day = days[np.argmax(daily_revenue)]
min_day = days[np.argmin(daily_revenue)]

## Add a horizontal line for average revenue
ax.axhline(y=avg_revenue, color='r', linestyle='--', alpha=0.7,
           label=f'Average Revenue: ${avg_revenue:.2f}')

## Format y-axis with dollar signs
formatter = ticker.StrMethodFormatter('${x:,.2f}')
ax.yaxis.set_major_formatter(formatter)

## Customize tick parameters
ax.tick_params(axis='both', which='major', labelsize=10)
ax.yaxis.set_major_locator(ticker.MaxNLocator(nbins=10))
ax.xaxis.set_major_locator(ticker.MultipleLocator(base=5))

## Add annotations for max and min revenue
ax.annotate(f'Max: ${max_revenue:.2f}', xy=(max_day, max_revenue),
            xytext=(max_day+1, max_revenue+200),
            arrowprops=dict(facecolor='black', shrink=0.05, width=1.5))

ax.annotate(f'Min: ${min_revenue:.2f}', xy=(min_day, min_revenue),
            xytext=(min_day+1, min_revenue-200),
            arrowprops=dict(facecolor='black', shrink=0.05, width=1.5))

## Add labels and title
ax.set_xlabel('Day of Month', fontsize=12)
ax.set_ylabel('Revenue ($)', fontsize=12)
ax.set_title('Daily Revenue Analysis - 30 Day Period', fontsize=14, fontweight='bold')

## Set x-axis limits to show a bit of padding
ax.set_xlim(0, 31)

## Add grid for better readability
ax.grid(True, linestyle='--', alpha=0.7)

## Add legend
ax.legend(loc='upper right', fontsize=10)

## Display the plot
plt.tight_layout()
plt.show()

print("Enhanced financial plot created successfully!")

После запуска этого кода вы должны увидеть гораздо более информативный график с:

  1. Форматированием значений на оси Y с использованием знака доллара
  2. Горизонтальной красной пунктирной линией, показывающей среднюю выручку
  3. Аннотациями, указывающими на дни с максимальной и минимальной выручкой
  4. Более четкими делениями с лучшим интервалом
  5. Легендой, показывающей, что представляет каждый элемент

Давайте объясним некоторые новые элементы:

  • ax.axhline() - Добавляет горизонтальную линию на заданном значении оси Y (в данном случае - средняя выручка)
  • ax.yaxis.set_major_locator() - Управляет количеством делений на оси Y
  • ax.xaxis.set_major_locator() - Устанавливает, чтобы на оси X деления отображались с интервалом в 5 дней
  • ax.annotate() - Добавляет текстовые аннотации с стрелками, указывающими на конкретные точки данных
  • ax.legend() - Добавляет легенду, объясняющую различные элементы на графике

Эти усовершенствования делают график гораздо более полезным для финансового анализа, выделяя ключевые статистические показатели и упрощая интерпретацию данных.

Сохранение графика и создание переиспользуемой функции

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

В новой ячейке вашего блокнота добавьте и запустите следующий код:

def create_currency_plot(x_data, y_data, title='Financial Data',
                         xlabel='X-Axis', ylabel='Amount ($)',
                         filename=None, show_stats=True):
    """
    Create a plot with currency formatting on the y-axis.

    Parameters:
    -----------
    x_data : array-like
        Data for the x-axis
    y_data : array-like
        Data for the y-axis (currency values)
    title : str
        Title of the plot
    xlabel : str
        Label for the x-axis
    ylabel : str
        Label for the y-axis
    filename : str, optional
        If provided, save the plot to this filename
    show_stats : bool
        Whether to show statistics (average, min, max)

    Returns:
    --------
    fig, ax : tuple
        The figure and axes objects
    """
    ## Import the necessary module for formatting
    import matplotlib.ticker as ticker

    ## Create a figure and axes
    fig, ax = plt.subplots(figsize=(12, 7))

    ## Plot the data
    ax.plot(x_data, y_data, marker='o', linestyle='-', color='blue',
            linewidth=2, markersize=6, label='Data')

    if show_stats:
        ## Calculate statistics
        avg_value = np.mean(y_data)
        max_value = np.max(y_data)
        min_value = np.min(y_data)
        max_x = x_data[np.argmax(y_data)]
        min_x = x_data[np.argmin(y_data)]

        ## Add a horizontal line for average value
        ax.axhline(y=avg_value, color='r', linestyle='--', alpha=0.7,
                   label=f'Average: ${avg_value:.2f}')

        ## Add annotations for max and min values
        ax.annotate(f'Max: ${max_value:.2f}', xy=(max_x, max_value),
                    xytext=(max_x+1, max_value+200),
                    arrowprops=dict(facecolor='black', shrink=0.05, width=1.5))

        ax.annotate(f'Min: ${min_value:.2f}', xy=(min_x, min_value),
                    xytext=(min_x+1, min_value-200),
                    arrowprops=dict(facecolor='black', shrink=0.05, width=1.5))

    ## Format y-axis with dollar signs
    formatter = ticker.StrMethodFormatter('${x:,.2f}')
    ax.yaxis.set_major_formatter(formatter)

    ## Customize tick parameters
    ax.tick_params(axis='both', which='major', labelsize=10)

    ## Add labels and title
    ax.set_xlabel(xlabel, fontsize=12)
    ax.set_ylabel(ylabel, fontsize=12)
    ax.set_title(title, fontsize=14, fontweight='bold')

    ## Add grid for better readability
    ax.grid(True, linestyle='--', alpha=0.7)

    ## Add legend
    if show_stats:
        ax.legend(loc='best', fontsize=10)

    ## Adjust layout
    plt.tight_layout()

    ## Save the plot if filename is provided
    if filename:
        plt.savefig(filename, dpi=300, bbox_inches='tight')
        print(f"Plot saved as '{filename}'")

    return fig, ax

## Use our function to create and save a plot
fig, ax = create_currency_plot(
    days,
    daily_revenue,
    title='Monthly Revenue Report',
    xlabel='Day of Month',
    ylabel='Daily Revenue ($)',
    filename='revenue_plot.png'
)

## Display the plot
plt.show()

print("Function created and plot saved successfully!")

После запуска этого кода вы должны увидеть:

  1. График, аналогичный тому, который мы создали на предыдущем этапе, но сгенерированный с использованием нашей пользовательской функции.
  2. Сообщение, подтверждающее, что график был сохранен в файл с именем revenue_plot.png.

Созданная нами функция:

  • Принимает данные для осей X и Y.
  • Позволяет настраивать метки и заголовок.
  • Имеет возможность сохранить график в файл.
  • Может отображать или скрывать статистические показатели, такие как среднее, минимальное и максимальное значения.
  • Возвращает объекты фигуры и осей для дальнейшей настройки при необходимости.

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

Чтобы убедиться, что наш график был сохранен правильно, проверим, существует ли файл:

import os
if os.path.exists('revenue_plot.png'):
    print("Plot file exists! Size:", os.path.getsize('revenue_plot.png'), "bytes")
else:
    print("Plot file was not saved correctly.")

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

Поздравляем! Вы успешно научились форматировать графики с использованием знаков доллара и создавать профессионально выглядящие финансовые визуализации с помощью Matplotlib.

Резюме

В этом практическом занятии (лабораторной работе) мы научились создавать финансовые графики с правильным форматированием денежных значений с использованием библиотеки Matplotlib. Мы рассмотрели несколько важных концепций:

  1. Генерацию и работу с примерными финансовыми данными.
  2. Создание базовых графиков с помощью Matplotlib.
  3. Форматирование меток на оси Y с использованием знака доллара с помощью класса StrMethodFormatter.
  4. Улучшение графиков с использованием статистических данных, аннотаций и улучшения стиля.
  5. Создание переиспользуемой функции для генерации графиков с единообразным форматированием денежных значений.

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

Техники, которые вы узнали, можно применить к различным финансовым наборам данных, таким как:

  • Отчеты о продажах и выручке.
  • Анализ бюджета.
  • Отслеживание инвестиционного результата.
  • Анализ затрат.
  • Отслеживание расходов.

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