في هذا البرنامج التعليمي، سوف نتعلم كيفية استخدام Plotly لإنشاء تصورات تفاعلية. يركز مشروعنا على تحليل نتائج رمي النرد. عند رمي حجر نرد ذو ستة جوانب، فإن أي رقم من 1 إلى 6 لديه فرصة متساوية للظهور. ومع ذلك، عندما تقوم برمي عدة نرد، تصبح بعض الأرقام أكثر احتمالاً من غيرها. هدفنا هو تحديد هذه الاحتمالات من خلال محاكاة رمي النرد وإنشاء مجموعة بيانات. بعد ذلك، سنقوم بتمثيل نتائج القوائم المتعددة بشكل مرئي لإظهار النتائج الأكثر احتمالية من الناحية الإحصائية.
Plotly هي مكتبة رسومية مفتوحة المصدر تتيح للمستخدمين إنشاء تصورات تفاعلية على شبكة الإنترنت. وهو يدعم العديد من أنواع المخططات، بما في ذلك المخططات الخطية والمخططات المبعثرة والمخططات الشريطية والمزيد. يعد Plotly مفيدًا بشكل خاص لإنشاء تصورات يمكن تضمينها في تطبيقات الويب، حيث يوفر ميزات تفاعلية مثل التكبير/التصغير والتحريك ومعلومات التمرير.
سنقوم بتثبيت Plotly باستخدام النقطة. نحتاج أيضًا إلى تثبيت مكتبة الباندا، وهي مكتبة للعمل بكفاءة مع البيانات، لأن Plotly Express يعتمد عليها.
$ python -m pip install --user plotly $ python -m pip install --user pandas
قم بزيارة معرض أنواع المخططات على موقع Plotly الإلكتروني لرؤية المرئيات المختلفة التي يمكنك إنشاؤها باستخدام Plotly.
أولاً، سنقوم بإنشاء فئة القالب التالية لمحاكاة رمي حجر النرد. سنقوم بتسمية الملف 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، سيكون عدد الجوانب ستة إذا لم يتم توفير وسيطة. إذا تم تقديم وسيطة، فسيتم تحديد عدد جوانب حجر النرد.
تستخدم طريقة roll () وظيفة randint () لإرجاع رقم عشوائي بين 1 وعدد الجوانب. يمكن لهذه الدالة إرجاع قيمة البداية (1)، أو قيمة النهاية (num_sides)، أو أي عدد صحيح بينهما. يتم تسمية النرد وفقًا لعدد جوانبه: النرد ذو الستة جوانب يسمى D6، والنرد ذو العشرة جوانب يسمى D10، وهكذا.
قمنا أولاً باستيراد وحدة Plotly Express باستخدام الاسم المستعار px لتجنب كتابةploly.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). أكبر نتيجة ممكنة هي مجموع أكبر رقم في كل قالب (16) والذي تم تعيينه لـ max_results. يعمل المتغير 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)
لقد حددنا العنوان وخصصناه لـ "العنوان". لقد أنشأنا قاموسًا لتحديد تسميات المحاور. تمثل مفاتيح القاموس التسميات التي نريد تخصيصها، بينما تمثل القيم التسميات المخصصة التي نريد استخدامها. نحن نسمي المحور السيني باسم "النتيجة" والمحور الصادي باسم "تردد النتيجة". لإنشاء رسم بياني شريطي، نستخدم الدالة 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()
يتم إنشاء الحبكة بعنوان وتسميات مناسبة لكل محور، كما هو موضح في الصورة أدناه.
هناك مشكلة واحدة نحتاج إلى معالجتها في الحبكة التي أنشأناها للتو. نظرًا لوجود 11 شريطًا، فإن إعدادات تخطيط المحور السيني الافتراضية تترك بعض الأشرطة بدون تسمية. على الرغم من أن الإعدادات الافتراضية كافية لمعظم المرئيات، إلا أن هذا المخطط سيظهر بشكل أفضل مع تسمية كافة الأشرطة.
يقدم Plotly طريقة update_layout() التي تتيح لك إجراء تغييرات مختلفة على الشكل بعد إنشائه. إليك كيفية توجيه Plotly لمنح كل شريط علامته الخاصة.
# Further customize chart. fig.update_layout(xaxis_dtick = 1) fig.show() #fig.write_html('dice_visual_d6d10.xhtml')
تنطبق طريقة update_layout() على كائن الشكل الذي يمثل المخطط بأكمله. نستخدم خيار xaxis_dtick لتعيين المسافة بين علامات التجزئة على المحور السيني. لقد قمنا بتعيين التباعد على 1 بحيث يتم تسمية كل شريط. عند تشغيل dice_visual.py مرة أخرى، يجب أن تشاهد التصنيفات على كل شريط.
يمكن تخصيص هذا الرمز بسهولة لمحاكاة رمي النرد بأحجام مختلفة. لإنشاء D6 وD10، قم بتمرير الوسيطتين 6 و10 عند إنشاء مثيلي القالب. قم بتغيير الحلقة الأولى إلى العدد المطلوب من اللفات وقم بتغيير عنوان الرسم البياني وفقًا لذلك.
يمكننا أن نجعل برنامجنا يحفظ المخطط كملف HTML تلقائيًا عن طريق استبدال استدعاءFig.show() باستدعاءFig.write_html().
تتطلب طريقة write_html() وسيطة واحدة: اسم الملف المراد الكتابة إليه. إذا قمت بتوفير اسم ملف فقط، فسيتم حفظ الملف في نفس الدليل مثل ملف .py. يمكنك أيضًا استدعاء 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')
للتوضيح، تستخدم القوائم في هذا القسم الصيغة الطويلة للحلقات. يمكننا إعادة بناء الكود باستخدام فهم القائمة لإحدى الحلقتين أو كلتيهما. إليك الكود الذي يستخدم فهم القائمة:
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 تجعل من السهل مشاركتها ودمجها في تطبيقات الويب. توضح هذه المقالة كيفية استخدام ميزات Plotly لإنشاء مخططات غنية بالمعلومات وجذابة. تعد Plotly أداة ممتازة لتحليل البيانات وعرضها.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3