1

Relatively new to Matplotlib. I plotted a cobweb diagram and is now hoping to change the r values via arrow keys as the program is running. Tried to use "import keyboard" along with a "running loop" but it doesn't seem to work. Can someone please explain?

import matplotlib.pyplot as plt
import keyboard
from scipy import linspace

r = 3.35
x0 = 0.3
running = True


def cobweb(f, x0):
    t = linspace(0, 1, 100)
    l = plt.plot(t, f(t))
    plt.plot(t, t)

    x, y = x0, f(x0)
    for _ in range(100):
        fy = f(y)
        plt.plot([x, y], [y, y], 'b', linewidth=1)
        plt.plot([y, y], [y, fy], 'b', linewidth=1)
        x, y = y, fy

    plt.xlabel("X n")
    plt.ylabel("X n+1")
    plt.show()
    plt.close()


while running:
    cobweb(lambda x: r * x * (1 - x), x0)
    if keyboard.is_pressed('up'):
        r += 0.1
    if keyboard.is_pressed('down'):
        r -= 0.1
    cobweb(lambda x: r * x * (1 - x), x0)

1 Answer 1

1

You need to turn on the interactive mode with plt.ion() and replace plt.show() with fig.canvas.draw(). Check the following code:

import matplotlib.pyplot as plt
import keyboard
# from scipy import linspace
from numpy import linspace
import time

r = 3.35
x0 = 0.3
running = True


def cobweb(f, x0):
    ax.cla()
    t = linspace(0, 1, 100)
    l = plt.plot(t, f(t))
    plt.plot(t, t)

    x, y = x0, f(x0)
    for _ in range(100):
        fy = f(y)
        plt.plot([x, y], [y, y], 'b', linewidth=1)
        plt.plot([y, y], [y, fy], 'b', linewidth=1)
        x, y = y, fy

    plt.xlabel("X n")
    plt.ylabel("X n+1")
    fig.canvas.draw()
    time.sleep(0.01)

plt.ion()
fig, ax = plt.subplots()

while running:
    if keyboard.is_pressed('up'):
        r += 0.1
    if keyboard.is_pressed('down'):
        r -= 0.1
    cobweb(lambda x: r*x*(1 - x), x0)

By pressing or , you will get plots like these:

enter image description here enter image description here

Note: if you use linspace by scipy, you get this warning:

DeprecationWarning: scipy.linspace is deprecated and will be removed in SciPy 2.0.0, use numpy.linspace instead

It is wise to replace it with

from numpy import linspace

as I done in the above code. The functionality of your code won't change

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.