ماذا يتطلب الأمر لوضع رسم بياني حي من Matplotlib في منشور؟

أعلم أن هذا خارج نطاق معظم المجتمعات، لكننا مجتمع علمي، نستخدم بايثون والكثير من الرسوم البيانية (Matplotlib) التي نشاركها مع بعضنا البعض عبر Discourse.

سيكون من المذهل أن نتمكن من مشاركة رسم بياني تفاعلي بدلاً من صورة jpg/png ثابتة.

ضع في اعتبارك هذا المثال:

import matplotlib.pyplot as plt
import mpld3
import numpy as np

Fs = 4000
f = 100
sample = 200
x = np.arange(sample)
y = np.sin(2 * np.pi * f * x / Fs)
fig, ax = plt.subplots(1,1)
ax.plot(x, y, marker=".")
html_str = mpld3.fig_to_html(fig)
Html_file= open("index.html","w")
Html_file.write(html_str)
Html_file.close()

ستتمكن من فتح ملف index.html وسيعرض ذلك (فقط أنه سيكون تفاعليًا…)

لذا، أشعر أننا قطعنا نصف الطريق، أليس كذلك؟
ربما مجرد تحميل ملف html بحيث يعمل في بعض الإطارات الداخلية؟

قد تكون الطريقة التي وصفتها ممكنة عبر إضافة مخصصة، تجمع بين إضافة بأسلوب markdown-it وتخزين كائنات جيد لملفات HTML. ومع ذلك، سأكون حذرًا بشأن أمانها، والسماح بتشغيل التعليمات البرمجية التي أدخلها المستخدم في أي مكان على الخادم. يقوم Discourse بالفعل بالكثير من العمل لمجرد تنقية منشور لـ HTML و JS ليتم تحليله بأمان في الواجهة الخلفية.

قد يكون لديك حظ أفضل بدلاً من ذلك في محاولة تضمين مترجم Python في المتصفح والسماح له بتشغيل التعليمات البرمجية على العميل، وتخطي إنشاء HTML بالكامل. سيسمح لك JupyterLite بتشغيل JupyterLab في المتصفح مع واجهة مستخدم. من الوثائق، يبدو أنه يمكنك تشغيل التعليمات البرمجية تلقائيًا عند إنشاء الإطار المضمن. يمكنك تغذية التعليمات البرمجية باستخدام إضافة HighlightJS مخصصة ستنشئ زرًا قابلاً للتنفيذ على أي كتلة تعليمات برمجية Python، أو تجعلها تعمل تلقائيًا.

لذا شيء مثل:

  1. يرى المستخدم منشورًا يحتوي على كتلة تعليمات برمجية Python.
  2. يقوم المستخدم بتمرير مؤشر الماوس فوق كتلة التعليمات البرمجية، حيث يظهر زر للسماح لهم بتشغيل التعليمات البرمجية في المتصفح.
  3. ينقر المستخدم على الزر، والذي ينشئ إطارًا مضمنًا لـ JupyterLite أسفل التعليمات البرمجية، ويستورد التعليمات البرمجية من كتلة التعليمات البرمجية.

نظرًا لأن هذا سيكون مجرد إضافة HighlightJS تنشئ إطارًا مضمنًا لـ JupyterLite، يمكنك إنشاء كل شيء داخل مكون سمة، ولا يلزم وجود تعليمات برمجية للخادم.

شيء واحد يجب ملاحظته: يوصف JupyterLite بأنه ليس مكتمل الميزات مثل JupyterLab، ولا أعرف كيف يتعامل مع استيراد الحزم، لذلك قد تضطر إلى استضافته بنفسك. يستخدم JupyterLite Pyodide، والذي يدعم أي عجلة على PyPI، لذلك يجب أن يكون جيدًا.

3 إعجابات

أعتقد أن المخاطر الأمنية ليست كبيرة في حال تشغيل index.html على جانب العميل (في متصفح المستخدم، وليس على خادم Discourse).

أيضًا، الميزة في نهج mpld3 هي أنه ملف واحد بدون تبعيات. إذا كنت تشغل Python خام، فيجب عليك أيضًا أن تكون قادرًا على تحميل جميع التبعيات مثل ملفات csv، وملفات البيانات، وما إلى ذلك، والتي هي مصدر ما تريد رسمه.

ومع ذلك، فإن القدرة على تشغيل نصوص Python خام داخل منشور Discourse ستكون رائعة!

إعجابَين (2)

أوه! لقد أسأت فهم كيفية إنشاء HTML تمامًا. إذا كان المستخدم يقوم بإنشاء HTML مسبقًا، فيمكنك جعله يقوم بتضمينه (iframe) من موقع خارجي، مع إدراج النطاق في القائمة البيضاء.

على سبيل المثال، codepen، والذي يجب السماح به افتراضيًا:

<iframe height="300" width="800" style="width: 100%;" scrolling="no" title="mplD3 example, actually working" src="https://codepen.io/gully/embed/BawMGr?default-tab=result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href="https://codepen.io/gully/pen/BawMGr">
  mplD3 example, actually working</a> by gully (<a href="https://codepen.io/gully">@gully</a>)
  on <a href="https://codepen.io">CodePen</a>.
</iframe>
3 إعجابات

يمكن القيام بذلك بالتأكيد:

إذا كان لديك العديد من المستخدمين، فقد تحتاج إلى المساعدة في أتمتة بعض الإعدادات.

يمكنني المساعدة إذا كانت لديك ميزانية.

5 إعجابات

هذا رائع حقًا!
لدي بعض الأسئلة:

  1. هل تعتقد أنه سيعمل مع ipympl (وإلا فإن الأشكال ليست تفاعلية، مما يبطل الغرض بأكمله)
  2. هل تعتقد أنه يمكن أن يعمل مع مجلد مشروع أساسي حيث يمكننا تعيين متغير البيئة PYTHONPATH قبل تشغيل Jupyter حتى يتمكن المستخدمون من استيراد الوظائف والتبعيات من المشروع المشترك؟

ونعم، لدي ميزانية إذا كان هذا معقولاً وعمليًا ويمكن المساهمة به كمصدر مفتوح لمجتمع Discourse بأكمله.

إعجابَين (2)

من المحتمل جداً

أرى طريقة يمكنك من خلالها إنشاء بيئة تعاونية.

لا تتردد في إرسال رسالة خاصة لي، يمكننا مناقشة الأمر عبر مكالمة.

إعجابَين (2)

@Alteras شكراً لك، هذا الحل بسيط للغاية ويعمل إذا تمكنت من إيجاد طريقة لتحميل ملف “index.heml” إلى Discourse (والذي يسهل تمكين تحميل .html) وتقديمه في كود iframe. المشكلة الوحيدة هي أنه لا يعمل فعليًا.. عندما أحاول ذلك، يقوم فقط بتنزيل index.html بدلاً من عرضه في iframe. ربما هناك علامة meta لإخبار iframe بعرض الملف بدلاً من تنزيله؟

آه، فهمت. يقوم Discourse افتراضيًا بتعيين أي مرفقات غير صور مع Content-Disposition على أنها “attachment” مما سيعاملها كتنزيل فقط.

قد تتمكن من القيام بشيء مشابه لـ Inline PDF Previews، والذي يبدو أنه يتعامل مع نفس المشكلة هذه، ولكن لتحميلات PDF.

إعجاب واحد (1)

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.