مفكرة Jupyter: مؤامرة مبعثرة مكررة تستخدم عند استخدام ipywidgets

2

أحاول التحكم في عرض مخطط مبعثر مع مربع اختيار. عندما صنعتها باستخدام وظيفة التفاعل ، عملت كما هو متوقع. تم عرض المؤامرة أو إخفاؤها بناءً على القيمة الموجودة في مربع الاختيار.

import matplotlib.pyplot as plt
from ipywidgets import interact, widgets
%matplotlib inline

def on_change(Display):
    if Display == True:
        plt.scatter(x,y)
        plt.show()  
    return Display

interact(on_change, Display=False);

عندما حاولت أن أفعل الشيء نفسه باستخدام وظيفة المراقبة في كل مرة أنقر فيها على مربع الاختيار أحصل على قطعة أرض إضافية معروضة أدناه. ما الذي أحتاجه للقيام به لإعادة رسم نفس المؤامرة بحيث يعمل مثل المثال أعلاه؟

أفترض أن شيئًا في المثال التفاعلي هو مسح الشاشة ولكن ليس من الواضح كيفية القيام بذلك يدويًا.

import matplotlib.pyplot as plt
from ipywidgets import interact, widgets
%matplotlib inline

x = [1,2,3,4,5,6,7,8]
y = [5,2,4,2,1,4,5,2]

def on_change(change):
    if change['new'] == True:
        scat = plt.scatter(x,y)
        plt.show()   

cb = widgets.Checkbox(False, description = "Display")
cb.observe(on_change, names='value')
display(cb)

1 إجابة

0

قمت ببعض التعديلات التي قمت بها على مثالك على أمل إظهار ما تريد. لقد اتخذت مسارًا أكثر توجهاً نحو الكائن ، ولست متأكدًا مما إذا كنت تريد تجنبه على وجه التحديد ولكنه يساعد في تحقيق النتيجة المرجوة ، يبدو أنك تتجه نحو واجهة مستخدم رسومية بسيطة هنا.

1) تضمين عنصر واجهة تعامل الإخراج ( out ) - في الأساس إخراج خلية يمكنك عرضه مثل عنصر واجهة مستخدم عادي. يمكنك استخدام كتلة مدير السياق ( with out: ) عندما تريد الطباعة إلى عنصر واجهة استخدام الإخراج المحدد. يمكنك أيضًا مسح الأداة باستخدام out.clear_output()

2) استخدم الواجهة الشيئية في matplotlib بدلاً من استخدام plt. أجد أن من الأسهل التحكم في المخططات التي يتم عرضها والموقع في الأوقات المناسبة.

  • تعليق matplotlib التفاعلي مؤقتًا باستخدام plt.ioff ()
  • إنشاء الشكل والمحور الخاص بك fig, ax = plt.subplots() . يمكن أن تحتوي أرقام ملحوظة على محاور / مخططات فرعية متعددة ولكننا بحاجة إلى واحد فقط.
  • "رسم" البيانات المبعثرة على المحور الخاص بك باستخدام ax.scatter(x,y) ، لكن هذا لن يتسبب في ظهوره.
  • اعرض الشكل بشكل صريح مع display(fig) .

أفترض أنك تريد استبدال الرقم الخاص بك في كل مرة تحدد المربع ، لذلك قمت بإدراجه في وظيفة المراقبة. إذا لم يتغير الرقم الخاص بك ، سيكون من المنطقي نقله خارج الحلقة.


import matplotlib.pyplot as plt
from ipywidgets import interact, widgets
%matplotlib inline

out = widgets.Output()

x = [1,2,3,4,5,6,7,8]
y = [5,2,4,2,1,4,5,2]

def on_change(change):
    if change['new'] == True:
        with out:
            plt.ioff()
            fig,ax = plt.subplots()
            ax.scatter(x,y)
            display(fig)
    else:
        out.clear_output()

cb = widgets.Checkbox(False, description = "Display")
cb.observe(on_change, names='value')
display(cb)
display(out)
:مؤلف
فوق
قائمة طعام