」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用 Plotly 進行互動式擲骰子資料視覺化

使用 Plotly 進行互動式擲骰子資料視覺化

發佈於2024-08-01
瀏覽:629

在本教程中,我们将学习如何使用 Plotly 创建交互式可视化。我们的项目重点是分析掷骰子的结果。当滚动单个六面骰子时,从 1 到 6 的任何数字都有相同的出现机会。然而,当您掷多个骰子时,某些数字变得比其他数字更有可能出现。我们的目标是通过模拟掷骰子并创建数据集来确定这些概率。之后,我们将直观地呈现多次掷骰的结果,以显示哪些结果在统计上更有可能。

什么是情节?

Plotly 是一个开源图形库,可让用户创建交互式、基于 Web 的可视化效果。它支持多种图表类型,包括线图、散点图、条形图等。 Plotly 对于创建可嵌入 Web 应用程序的可视化效果特别有用,因为它提供缩放、平移和悬停信息等交互功能。

情节安装

我们将使用 pip 安装 Plotly。我们还需要安装 pandas,一个用于高效处理数据的库,因为 Plotly Express 依赖于它。

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

访问 Plotly 网站上的图表类型库,查看可以使用 Plotly 创建的不同可视化效果。

创建模具类

首先,我们将创建以下 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 __ 方法采用一个可选参数。创建 Die 实例时,如果未提供参数,边数将为 6。如果给出参数,它将设置骰子的面数。

roll() 方法使用 randint() 函数返回 1 到边数之间的随机数。此函数可以返回起始值 (1)、结束值 (num_sides) 或两者之间的任何整数。骰子根据面数命名:六面骰子称为 D6,十面骰子称为 D10,依此类推。

掷骰子

我们首先使用别名 px 导入 Plotly Express 模块,以避免重复输入plotly.express。我们将创建一个骰子实例来模拟掷两个 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 的代码的可读性。我们可以编写范围 (2,16),但这仅适用于两个 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

进一步定制

我们需要解决我们刚刚创建的绘图的一个问题。由于有 11 个条形图,默认的 x 轴布局设置使某些条形图未标记。虽然默认设置足以满足大多数可视化效果,但如果所有条形图均已标记,此图表会显得更好。

Plotly 提供了 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,请在创建两个 die 实例时传递参数 6 和 10。将第一个循环更改为所需的卷数并相应地更改图表的标题。

通过调用Fig.write_html()替换对fig.show()的调用,我们可以让程序自动将图表保存为HTML文件。

write_html() 方法需要一个参数:要写入的文件的名称。如果您只提供文件名,该文件将保存在与 .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]刪除
最新教學 更多>
  • 為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    查詢模式實現缺失:解決“無法找到”錯誤在Silverlight應用程序中,嘗試使用LINQ建立LINQ連接以錯誤而實現的數據庫”,無法找到查詢模式的實現。”當省略LINQ名稱空間或查詢類型缺少IEnumerable 實現時,通常會發生此錯誤。 解決問題來驗證該類型的質量是至關重要的。在此特定實例...
    程式設計 發佈於2025-03-26
  • 如何在GO編譯器中自定義編譯優化?
    如何在GO編譯器中自定義編譯優化?
    在GO編譯器中自定義編譯優化 GO中的默認編譯過程遵循特定的優化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    程式設計 發佈於2025-03-26
  • \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    答案: 在大多數現代編譯器中,while(1)和(1)和(;;)之間沒有性能差異。編譯器: perl: 1 輸入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    程式設計 發佈於2025-03-26
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript [#1089-不正確的前綴鍵在嘗試在表中創建一個prefix鍵時會出現。前綴鍵旨在索引字符串列的特定前綴長度長度,可以更快地搜索這些前綴。 了解prefix keys `這將在整個Movie_ID列上創建標準主鍵。主密鑰對於唯一識...
    程式設計 發佈於2025-03-26
  • 如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    為有效的slug生成首先,該函數用指定的分隔符替換所有非字母或數字字符。此步驟可確保slug遵守URL慣例。隨後,它採用ICONV函數將文本簡化為us-ascii兼容格式,從而允許更廣泛的字符集合兼容性。 接下來,該函數使用正則表達式刪除了不需要的字符,例如特殊字符和空格。此步驟可確保slug僅包...
    程式設計 發佈於2025-03-26
  • 如何簡化PHP中的JSON解析以獲取多維陣列?
    如何簡化PHP中的JSON解析以獲取多維陣列?
    php 試圖在PHP中解析JSON數據的JSON可能具有挑戰性,尤其是在處理多維數組時。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    程式設計 發佈於2025-03-26
  • 您如何在Laravel Blade模板中定義變量?
    您如何在Laravel Blade模板中定義變量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配變量對於存儲以後使用的數據至關重要。在使用“ {{}}”分配變量的同時,它可能並不總是最優雅的解決方案。 幸運的是,Blade通過@php Directive提供了更優雅的方法: $ old_section =...
    程式設計 發佈於2025-03-26
  • 如何使用PHP將斑點(圖像)正確插入MySQL?
    如何使用PHP將斑點(圖像)正確插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call fil...
    程式設計 發佈於2025-03-26
  • 如何有效地選擇熊貓數據框中的列?
    如何有效地選擇熊貓數據框中的列?
    在處理數據操作任務時,在Pandas DataFrames 中選擇列時,選擇特定列的必要條件是必要的。在Pandas中,選擇列的各種選項。 選項1:使用列名 如果已知列索引,請使用ILOC函數選擇它們。請注意,python索引基於零。 df1 = df.iloc [:,0:2]#使用索引0和1 ...
    程式設計 發佈於2025-03-26
  • 如何正確使用與PDO參數的查詢一樣?
    如何正確使用與PDO參數的查詢一樣?
    在pdo 中使用類似QUERIES在PDO中的Queries時,您可能會遇到類似疑問中描述的問題:此查詢也可能不會返回結果,即使$ var1和$ var2包含有效的搜索詞。錯誤在於不正確包含%符號。 通過將變量包含在$ params數組中的%符號中,您確保將%字符正確替換到查詢中。沒有此修改,PD...
    程式設計 發佈於2025-03-26
  • 如何在Java中執行命令提示命令,包括目錄更改,包括目錄更改?
    如何在Java中執行命令提示命令,包括目錄更改,包括目錄更改?
    在java 通過Java通過Java運行命令命令可能很具有挑戰性。儘管您可能會找到打開命令提示符的代碼段,但他們通常缺乏更改目錄並執行其他命令的能力。 solution:使用Java使用Java,使用processBuilder。這種方法允許您:啟動一個過程,然後將其標準錯誤重定向到其標準輸出...
    程式設計 發佈於2025-03-26
  • 在Ubuntu/linux上安裝mysql-python時,如何修復\“ mysql_config \”錯誤?
    在Ubuntu/linux上安裝mysql-python時,如何修復\“ mysql_config \”錯誤?
    mysql-python安裝錯誤:“ mysql_config找不到”“ 由於缺少MySQL開發庫而出現此錯誤。解決此問題,建議在Ubuntu上使用該分發的存儲庫。使用以下命令安裝Python-MysqldB: sudo apt-get安裝python-mysqldb sudo pip in...
    程式設計 發佈於2025-03-26
  • 如何使用Depimal.parse()中的指數表示法中的數字?
    如何使用Depimal.parse()中的指數表示法中的數字?
    在嘗試使用Decimal.parse(“ 1.2345e-02”中的指數符號表示法表示的字符串時,您可能會遇到錯誤。這是因為默認解析方法無法識別指數符號。 成功解析這樣的字符串,您需要明確指定它代表浮點數。您可以使用numbersTyles.Float樣式進行此操作,如下所示:[&& && && ...
    程式設計 發佈於2025-03-26
  • 如何在JavaScript對像中動態設置鍵?
    如何在JavaScript對像中動態設置鍵?
    在嘗試為JavaScript對象創建動態鍵時,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正確的方法採用方括號: jsobj ['key''i] ='example'1; 在JavaScript中,數組是一...
    程式設計 發佈於2025-03-26
  • 如何在Java字符串中有效替換多個子字符串?
    如何在Java字符串中有效替換多個子字符串?
    在java 中有效地替換多個substring,需要在需要替換一個字符串中的多個substring的情況下,很容易求助於重複應用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    程式設計 發佈於2025-03-26

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3