Matplotlib を使った通貨プロットのフォーマット

Beginner

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

はじめに

金融データを視覚化する際には、軸に適切な通貨記号を付けてフォーマットすることが重要です。Matplotlib は可視化を作成するための強力な Python ライブラリですが、デフォルトでは軸に通貨記号を表示しません。

この実験では、Matplotlib のプロットをカスタマイズして y 軸のラベルにドル記号を表示する方法を学びます。このスキルは、金融データ、売上高、予算、または通貨フォーマットが必要なその他のデータセットを扱う際に役立ちます。

VM のヒント

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

このサンプルデータは、30 日間の日次収益が 1,000 ドルから 5,000 ドルの間の値を表しています。次のステップでこのデータを使ってプロットを作成します。

基本的な金融プロットの作成

データが用意できたので、日次収益を可視化する基本的なプロットを作成しましょう。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 軸の目盛りラベルをフォーマットするには、Matplotlib の ticker モジュールを使用します。このモジュールには様々なフォーマットオプションが用意されています。具体的には、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 - 小数点以下 2 桁に丸めます(例:$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. StrMethodFormatter クラスを使用して Y 軸のラベルにドル記号を付けるフォーマット
  4. 統計情報、注釈、および改善されたスタイルでプロットを強化する
  5. 一貫した通貨フォーマットのプロットを生成するための再利用可能な関数の作成

これらのスキルは、金融データの可視化に携わる人にとって不可欠です。これらにより、貨幣価値を明確に伝えるプロフェッショナルで有益なチャートを作成できます。

学んだ技術は、以下のような様々な金融データセットに適用できます。

  • 売上と収益レポート
  • 予算分析
  • 投資パフォーマンスの追跡
  • コスト分析
  • 経費の追跡

通貨記号で軸を適切にフォーマットすることで、可視化をより直感的でプロフェッショナルなものにし、データの伝達効果を高めることができます。