Matplotlib Interactive Functions

PythonPythonBeginner
Practice Now

This tutorial is from open-source community. Access the source code

Introduction

In this lab, we will learn how to use the interactive functions in Matplotlib. These interactive functions include ginput, waitforbuttonpress, and manual clabel placement. The purpose of this lab is to help you understand how to use these functions to create interactive plots in Matplotlib. By the end of this lab, you will be able to create and modify plots using interactive functions in Matplotlib.

VM Tips

After the VM startup is done, click the top left corner to switch to the Notebook tab to access Jupyter Notebook for practice.

Sometimes, you may need to wait a few seconds for Jupyter Notebook to finish loading. The validation of operations cannot be automated because of limitations in Jupyter Notebook.

If you face issues during learning, feel free to ask Labby. Provide feedback after the session, and we will promptly resolve the problem for you.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("`Python`")) -.-> python/BasicConceptsGroup(["`Basic Concepts`"]) python(("`Python`")) -.-> python/FileHandlingGroup(["`File Handling`"]) matplotlib(("`Matplotlib`")) -.-> matplotlib/BasicConceptsGroup(["`Basic Concepts`"]) matplotlib(("`Matplotlib`")) -.-> matplotlib/PlotCustomizationGroup(["`Plot Customization`"]) matplotlib(("`Matplotlib`")) -.-> matplotlib/SpecializedPlotsGroup(["`Specialized Plots`"]) python(("`Python`")) -.-> python/ControlFlowGroup(["`Control Flow`"]) python(("`Python`")) -.-> python/DataStructuresGroup(["`Data Structures`"]) python(("`Python`")) -.-> python/FunctionsGroup(["`Functions`"]) python(("`Python`")) -.-> python/ModulesandPackagesGroup(["`Modules and Packages`"]) python(("`Python`")) -.-> python/DataScienceandMachineLearningGroup(["`Data Science and Machine Learning`"]) python/BasicConceptsGroup -.-> python/comments("`Comments`") python/FileHandlingGroup -.-> python/with_statement("`Using with Statement`") matplotlib/BasicConceptsGroup -.-> matplotlib/importing_matplotlib("`Importing Matplotlib`") matplotlib/BasicConceptsGroup -.-> matplotlib/figures_axes("`Understanding Figures and Axes`") matplotlib/PlotCustomizationGroup -.-> matplotlib/titles_labels("`Adding Titles and Labels`") matplotlib/SpecializedPlotsGroup -.-> matplotlib/contour_plots("`Contour Plots`") python/BasicConceptsGroup -.-> python/booleans("`Booleans`") python/ControlFlowGroup -.-> python/conditional_statements("`Conditional Statements`") python/ControlFlowGroup -.-> python/for_loops("`For Loops`") python/ControlFlowGroup -.-> python/while_loops("`While Loops`") python/ControlFlowGroup -.-> python/break_continue("`Break and Continue`") python/DataStructuresGroup -.-> python/lists("`Lists`") python/DataStructuresGroup -.-> python/tuples("`Tuples`") python/FunctionsGroup -.-> python/function_definition("`Function Definition`") python/ModulesandPackagesGroup -.-> python/importing_modules("`Importing Modules`") python/ModulesandPackagesGroup -.-> python/standard_libraries("`Common Standard Libraries`") python/DataScienceandMachineLearningGroup -.-> python/numerical_computing("`Numerical Computing`") python/DataScienceandMachineLearningGroup -.-> python/data_visualization("`Data Visualization`") python/FunctionsGroup -.-> python/build_in_functions("`Build-in Functions`") subgraph Lab Skills python/comments -.-> lab-48754{{"`Matplotlib Interactive Functions`"}} python/with_statement -.-> lab-48754{{"`Matplotlib Interactive Functions`"}} matplotlib/importing_matplotlib -.-> lab-48754{{"`Matplotlib Interactive Functions`"}} matplotlib/figures_axes -.-> lab-48754{{"`Matplotlib Interactive Functions`"}} matplotlib/titles_labels -.-> lab-48754{{"`Matplotlib Interactive Functions`"}} matplotlib/contour_plots -.-> lab-48754{{"`Matplotlib Interactive Functions`"}} python/booleans -.-> lab-48754{{"`Matplotlib Interactive Functions`"}} python/conditional_statements -.-> lab-48754{{"`Matplotlib Interactive Functions`"}} python/for_loops -.-> lab-48754{{"`Matplotlib Interactive Functions`"}} python/while_loops -.-> lab-48754{{"`Matplotlib Interactive Functions`"}} python/break_continue -.-> lab-48754{{"`Matplotlib Interactive Functions`"}} python/lists -.-> lab-48754{{"`Matplotlib Interactive Functions`"}} python/tuples -.-> lab-48754{{"`Matplotlib Interactive Functions`"}} python/function_definition -.-> lab-48754{{"`Matplotlib Interactive Functions`"}} python/importing_modules -.-> lab-48754{{"`Matplotlib Interactive Functions`"}} python/standard_libraries -.-> lab-48754{{"`Matplotlib Interactive Functions`"}} python/numerical_computing -.-> lab-48754{{"`Matplotlib Interactive Functions`"}} python/data_visualization -.-> lab-48754{{"`Matplotlib Interactive Functions`"}} python/build_in_functions -.-> lab-48754{{"`Matplotlib Interactive Functions`"}} end

Define a Triangle by Clicking Three Points

In this step, we will define a triangle by clicking three points. We will use the ginput and waitforbuttonpress functions to achieve this. The ginput function allows us to select points on the plot with the mouse, and the waitforbuttonpress function waits for a button press event.

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

def tellme(s):
    print(s)
    plt.title(s, fontsize=16)
    plt.draw()

plt.figure()
plt.xlim(0, 1)
plt.ylim(0, 1)

tellme('You will define a triangle, click to begin')

plt.waitforbuttonpress()

while True:
    pts = []
    while len(pts) < 3:
        tellme('Select 3 corners with mouse')
        pts = np.asarray(plt.ginput(3, timeout=-1))
        if len(pts) < 3:
            tellme('Too few points, starting over')
            time.sleep(1)  ## Wait a second

    ph = plt.fill(pts[:, 0], pts[:, 1], 'r', lw=2)

    tellme('Happy? Key click for yes, mouse click for no')

    if plt.waitforbuttonpress():
        break

    ## Get rid of fill
    for p in ph:
        p.remove()

Contour According to Distance from Triangle Corners

In this step, we will contour according to the distance from triangle corners. We will define a function of distance from individual points and contour according to this function.

## Define a nice function of distance from individual pts
def f(x, y, pts):
    z = np.zeros_like(x)
    for p in pts:
        z = z + 1/(np.sqrt((x - p[0])**2 + (y - p[1])**2))
    return 1/z

X, Y = np.meshgrid(np.linspace(-1, 1, 51), np.linspace(-1, 1, 51))
Z = f(X, Y, pts)

CS = plt.contour(X, Y, Z, 20)

tellme('Use mouse to select contour label locations, middle button to finish')
CL = plt.clabel(CS, manual=True)

Zoom

In this step, we will zoom in on the plot. We will use the ginput function to select two corners of the zoom box and the waitforbuttonpress function to finish the zoom.

tellme('Now do a nested zoom, click to begin')
plt.waitforbuttonpress()

while True:
    tellme('Select two corners of zoom, middle mouse button to finish')
    pts = plt.ginput(2, timeout=-1)
    if len(pts) < 2:
        break
    (x0, y0), (x1, y1) = pts
    xmin, xmax = sorted([x0, x1])
    ymin, ymax = sorted([y0, y1])
    plt.xlim(xmin, xmax)
    plt.ylim(ymin, ymax)

tellme('All Done!')
plt.show()

Summary

In this lab, we learned how to use interactive functions in Matplotlib to create and modify plots. We used ginput, waitforbuttonpress, and manual clabel placement to define a triangle, contour according to the distance from triangle corners, and zoom in on the plot. By using these functions, we can create interactive plots that allow the user to interact with the data and explore it in more detail.

Other Python Tutorials you may like