「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > インタラクティブなサイコロの目データの視覚化に Plotly を使用する

インタラクティブなサイコロの目データの視覚化に Plotly を使用する

2024 年 8 月 1 日に公開
ブラウズ:287

このチュートリアルでは、Plotly を使用してインタラクティブなビジュアライゼーションを作成する方法を学びます。私たちのプロジェクトは、サイコロを振った結果を分析することに焦点を当てています。 1 つの 6 面サイコロを振ると、1 から 6 までのどの数字も同じ確率で出現します。ただし、複数のサイコロを振ると、一部の数字が他の数字よりも確率が高くなります。私たちの目標は、サイコロの出目をシミュレートし、データセットを作成することによって、これらの確率を決定することです。その後、複数のロールの結果を視覚的に表現して、どの結果が統計的により可能性が高いかを示します。

プロットリーとは何ですか?

Plotly は、ユーザーがインタラクティブな Web ベースのビジュアライゼーションを作成できるオープンソースのグラフ作成ライブラリです。折れ線グラフ、散布図、棒グラフなど、多くの種類のグラフをサポートしています。 Plotly は、ズーム、パン、ホバー情報などのインタラクティブな機能を提供するため、Web アプリケーションに埋め込むことができるビジュアライゼーションの作成に特に役立ちます。

Plotly のインストール

pip を使用して Plotly をインストールします。 Plotly Express は Plotly Express に依存しているため、データを効率的に操作するためのライブラリである pandas もインストールする必要があります。

$ python -m pip install --user plotly
$ python -m pip install --user pandas

Plotly の Web サイトにあるチャート タイプのギャラリーにアクセスして、Plotly で作成できるさまざまなビジュアライゼーションを確認してください。

Die クラスの作成

まず、サイコロの目をシミュレートするために次の Die クラスを作成します。ファイルに Die.py.
という名前を付けます。

from random import randint

class Die:
    """A class representing a single die."""

    def __init__(self, num_sides = 6):
        """Assume a six-sided die"""
        self.num_sides = num_sides


    def roll(self):
        """Return a random value between 1 and number of sides."""
        return randint(1, self.num_sides)

__ init __ メソッドはオプションの引数を 1 つ受け取ります。 Die のインスタンスが作成されるとき、引数が指定されていない場合、面の数は 6 になります。引数が与えられると、サイコロの面の数が設定されます。

roll() メソッドは randint() 関数を使用して、1 から面の数までの乱数を返します。この関数は、開始値 (1)、終了値 (num_sides)、またはその間の任意の整数を返すことができます。サイコロの名前は面の数に応じて付けられます。6 面のサイコロは D6、10 面のサイコロは D10 などと呼ばれます。

サイコロを振る

最初に、plotly.express を繰り返し入力しないように、エイリアス px を使用して Plotly Express モジュールをインポートします。 2 つの D8 サイコロを振ることをシミュレートするサイコロのインスタンスを作成します。このファイルに dice_visual.py.
という名前を付けます。

import plotly.express as px

from die import Die

# Create two D8.
die_1 = Die(8)
die_2 = Die(8)

# Make some rolls, and store results in a list.
results = []
for roll_num in range(500_000):
    result = die_1.roll()   die_2.roll()
    results.append(result)

結果の分析

可能な最小の結果は、各サイコロの最小の数字の合計です (2)。可能な最大の結果は、max_results に割り当てられる各サイコロの最大数の合計 (16) です。変数 max_result により、poss_results を生成するコードの可読性が向上します。 range (2,16) と書くこともできましたが、これは 2 つの D8 ダイスに対してのみ機能します。現実世界の状況をシミュレートするときは、幅広いシナリオを容易に処理できるコードを開発するのが最善です。

# Analyze the result.
frequencies = []
max_results = die_1.num_sides   die_2.num_sides
poss_results = range(2, max_results   1)
for value in poss_results:
    frequency = results.count(value)
    frequencies.append(frequency)

結果を視覚化する。

タイトルを定義し、「title」に割り当てました。軸ラベルを指定する辞書を作成しました。辞書のキーはカスタマイズするラベルを表し、値は使用するカスタム ラベルを表します。 x 軸に「結果」、y 軸に「結果の頻度」という名前を付けます。棒グラフを作成するには、px.bar() 関数を使用し、オプションの変数 'title' と 'labels' を渡します。

# Visualize the results.
title = "Results of Rolling Two D8 Dice 500,000 Times"
labels = {'x': 'Result', 'y': 'Frequency of Result'}
fig = px.bar(x = poss_results, y = frequencies, title = title,
 labels = labels)
fig.show()

下の図に示すように、各軸に適切なタイトルとラベルを付けてプロットが生成されます。

Image description

さらなるカスタマイズ

作成したばかりのプロットには対処する必要がある問題が 1 つあります。バーが 11 本あるため、デフォルトの X 軸レイアウト設定では、一部のバーにラベルが付けられていません。ほとんどのビジュアライゼーションにはデフォルト設定で十分ですが、このグラフはすべての棒にラベルを付けた方が見やすくなります。

Plotly は、Figure の作成後にさまざまな変更を加えることができる update_layout() メソッドを提供します。各バーに独自のラベルを付けるように Plotly に指示する方法は次のとおりです。

# Further customize chart.
fig.update_layout(xaxis_dtick = 1)
fig.show()
#fig.write_html('dice_visual_d6d10.xhtml')

update_layout() メソッドは、グラフ全体を表す fig オブジェクトに適用されます。 xaxis_dtick オプションを使用して、x 軸上の目盛り間の距離を設定します。各バーにラベルが付けられるように、間隔を 1 に設定します。 dice_visual.py を再度実行すると、各バーにラベルが表示されるはずです。

Image description

このコードは、さまざまなサイズのサイコロを振ることをシミュレートするために簡単にカスタマイズできます。 D6 と D10 を作成するには、2 つのダイ インスタンスを作成するときに引数 6 と 10 を渡します。最初のループを目的のロール数に変更し、それに応じてグラフのタイトルを変更します。

fig.show() の呼び出しを fig.write_html() の呼び出しに置き換えることで、プログラムにチャートを HTML ファイルとして自動的に保存させることができます。

write_html() メソッドには、書き込み先のファイルの名前という 1 つの引数が必要です。ファイル名のみを指定した場合、ファイルは .py ファイルと同じディレクトリに保存されます。 Path オブジェクトを指定して write_html() を呼び出して、出力ファイルをシステム上の任意の場所に保存することもできます。

完全なコードは次のとおりです:

import plotly.express as px

from die import Die

# Create two D8.
die_1 = Die(8)
die_2 = Die(8)

# Make some rolls, and store results in a list.
results = []
for roll_num in range(500_000):
    result = die_1.roll()   die_2.roll()
    results.append(result)

# Analyze the result.
frequencies = []
max_results = die_1.num_sides   die_2.num_sides
poss_results = range(2, max_results   1)
for value in poss_results:
    frequency = results.count(value)
    frequencies.append(frequency)

# Visualize the results.
title = "Results of Rolling Two D8 Dice 500,000 Times"
labels = {'x': 'Result', 'y': 'Frequency of Result'}
fig = px.bar(x = poss_results, y = frequencies, title = title, labels = labels)

# Further customize chart.
fig.update_layout(xaxis_dtick = 1)
fig.write_html('dice_visual.xhtml')

リファクタリング

わかりやすくするために、このセクションのリストでは長い形式の for ループを使用しています。ループの一方または両方にリスト内包表記を使用して、コードをリファクタリングできます。リスト内包表記を使用したコードは次のとおりです:

import plotly.express as px

from die import Die

# Create two D8.
die_1 = Die(8)
die_2 = Die(8)

# Make some rolls, and store results in a list.
results = [die_1.roll()   die_2.roll() for roll_num in range(500_000) ]

# Analyze the result.
max_results = die_1.num_sides   die_2.num_sides
poss_results = range(2, max_results   1)
frequencies = [results.count(value) for value in poss_results]

# Visualize the results.
title = "Results of Rolling Two D8 Dice 500,000 Times"
labels = {'x': 'Result', 'y': 'Frequency of Result'}
fig = px.bar(x = poss_results, y = frequencies, title = title, labels = labels)

# Further customize chart.
fig.update_layout(xaxis_dtick = 1)

fig.write_html('dice_visual_list_comprehension.xhtml')

結論

結論として、統計データの分析と表示は強力になり、インタラクティブなサイコロの目データの視覚化のために Plotly を使用すると魅力的になります。サイコロの出目をシミュレートし、結果を視覚化することで、さまざまな結果の確率をより深く理解できるようになります。ホバー情報、パン、ズームなどの Plotly のインタラクティブ機能は、ユーザー エクスペリエンスを向上させ、データへのアクセスを容易にします。さらに、ビジュアライゼーションをカスタマイズして HTML ファイルとして保存できるため、ビジュアライゼーションの共有や Web アプリケーションへの統合が簡単になります。この記事では、Plotly の機能を使用して有益で魅力的なグラフを作成する方法を説明します。 Plotly は、データ分析とプレゼンテーションのための優れたツールです。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/terrancoder/using-plotly-for-interactive-dice-roll-data-visualization-48f6?1 侵害がある場合は、[email protected] に連絡して削除してください。それ
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3