Matplotlib Marker Customization Tutorial

PythonPythonBeginner
Practice Now

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

Introduction

This tutorial will guide you through the process of using the markevery property of Line2D to draw markers at a subset of data points in Matplotlib. We will cover various ways to specify the markers, including using integers, tuples, lists, slices, and floats. We will also explore how markevery behaves with linear and logarithmic scales, as well as with zoomed and polar plots.

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/PlottingDataGroup(["`Plotting Data`"]) matplotlib(("`Matplotlib`")) -.-> matplotlib/AdvancedPlottingGroup(["`Advanced Plotting`"]) python(("`Python`")) -.-> python/ControlFlowGroup(["`Control Flow`"]) python(("`Python`")) -.-> python/DataStructuresGroup(["`Data Structures`"]) python(("`Python`")) -.-> python/ModulesandPackagesGroup(["`Modules and Packages`"]) python(("`Python`")) -.-> python/PythonStandardLibraryGroup(["`Python Standard Library`"]) python(("`Python`")) -.-> python/DataScienceandMachineLearningGroup(["`Data Science and Machine Learning`"]) python(("`Python`")) -.-> python/FunctionsGroup(["`Functions`"]) 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/PlottingDataGroup -.-> matplotlib/line_plots("`Line Plots`") matplotlib/AdvancedPlottingGroup -.-> matplotlib/log_scale("`Logarithmic Scale`") python/BasicConceptsGroup -.-> python/variables_data_types("`Variables and Data Types`") python/ControlFlowGroup -.-> python/for_loops("`For Loops`") python/DataStructuresGroup -.-> python/lists("`Lists`") python/DataStructuresGroup -.-> python/tuples("`Tuples`") python/DataStructuresGroup -.-> python/dictionaries("`Dictionaries`") python/DataStructuresGroup -.-> python/sets("`Sets`") python/ModulesandPackagesGroup -.-> python/importing_modules("`Importing Modules`") python/PythonStandardLibraryGroup -.-> python/data_collections("`Data Collections`") 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-48820{{"`Matplotlib Marker Customization Tutorial`"}} python/with_statement -.-> lab-48820{{"`Matplotlib Marker Customization Tutorial`"}} matplotlib/importing_matplotlib -.-> lab-48820{{"`Matplotlib Marker Customization Tutorial`"}} matplotlib/figures_axes -.-> lab-48820{{"`Matplotlib Marker Customization Tutorial`"}} matplotlib/line_plots -.-> lab-48820{{"`Matplotlib Marker Customization Tutorial`"}} matplotlib/log_scale -.-> lab-48820{{"`Matplotlib Marker Customization Tutorial`"}} python/variables_data_types -.-> lab-48820{{"`Matplotlib Marker Customization Tutorial`"}} python/for_loops -.-> lab-48820{{"`Matplotlib Marker Customization Tutorial`"}} python/lists -.-> lab-48820{{"`Matplotlib Marker Customization Tutorial`"}} python/tuples -.-> lab-48820{{"`Matplotlib Marker Customization Tutorial`"}} python/dictionaries -.-> lab-48820{{"`Matplotlib Marker Customization Tutorial`"}} python/sets -.-> lab-48820{{"`Matplotlib Marker Customization Tutorial`"}} python/importing_modules -.-> lab-48820{{"`Matplotlib Marker Customization Tutorial`"}} python/data_collections -.-> lab-48820{{"`Matplotlib Marker Customization Tutorial`"}} python/numerical_computing -.-> lab-48820{{"`Matplotlib Marker Customization Tutorial`"}} python/data_visualization -.-> lab-48820{{"`Matplotlib Marker Customization Tutorial`"}} python/build_in_functions -.-> lab-48820{{"`Matplotlib Marker Customization Tutorial`"}} end

Define the Data Points

First, we define the data points that we will use for our plots. In this example, we use numpy to generate a set of x and y values for a sine wave.

import matplotlib.pyplot as plt
import numpy as np

## define a list of markevery cases to plot
cases = [
    None,
    8,
    (30, 8),
    [16, 24, 32],
    [0, -1],
    slice(100, 200, 3),
    0.1,
    0.4,
    (0.2, 0.4)
]

## data points
delta = 0.11
x = np.linspace(0, 10 - 2 * delta, 200) + delta
y = np.sin(x) + 1.0 + delta

Create Plots with Linear Scales

Next, we create a set of subplots to show how markevery behaves with linear scales. We iterate through the cases list and plot each case on a separate subplot. We use the markevery parameter to specify which data points to mark.

## create plots with linear scales
fig, axs = plt.subplots(3, 3, figsize=(10, 6), layout='constrained')
for ax, markevery in zip(axs.flat, cases):
    ax.set_title(f'markevery={markevery}')
    ax.plot(x, y, 'o', ls='-', ms=4, markevery=markevery)

Create Plots with Logarithmic Scales

We repeat the previous step, but this time with logarithmic scales. We note that the logarithmic scale causes a visual asymmetry in the marker distance for integer-based subsampling, while fraction-based subsampling creates even distributions.

## create plots with logarithmic scales
fig, axs = plt.subplots(3, 3, figsize=(10, 6), layout='constrained')
for ax, markevery in zip(axs.flat, cases):
    ax.set_title(f'markevery={markevery}')
    ax.set_xscale('log')
    ax.set_yscale('log')
    ax.plot(x, y, 'o', ls='-', ms=4, markevery=markevery)

Create Zoomed Plots

We create another set of subplots, this time to show how markevery behaves on zoomed plots. We note that integer-based subsampling selects points from the underlying data and is independent of the view, while float-based subsampling is related to the Axes diagonal and changes the displayed data range.

## create zoomed plots
fig, axs = plt.subplots(3, 3, figsize=(10, 6), layout='constrained')
for ax, markevery in zip(axs.flat, cases):
    ax.set_title(f'markevery={markevery}')
    ax.plot(x, y, 'o', ls='-', ms=4, markevery=markevery)
    ax.set_xlim((6, 6.7))
    ax.set_ylim((1.1, 1.7))

Create Polar Plots

Finally, we create a set of subplots to show how markevery behaves on polar plots. We note that the behavior is similar to that on linear scales.

## create polar plots
r = np.linspace(0, 3.0, 200)
theta = 2 * np.pi * r

fig, axs = plt.subplots(3, 3, figsize=(10, 6), layout='constrained',
                        subplot_kw={'projection': 'polar'})
for ax, markevery in zip(axs.flat, cases):
    ax.set_title(f'markevery={markevery}')
    ax.plot(theta, r, 'o', ls='-', ms=4, markevery=markevery)

Summary

In this tutorial, we learned how to use the markevery property of Line2D to draw markers at a subset of data points in Matplotlib. We explored various ways to specify the markers, including using integers, tuples, lists, slices, and floats. We also saw how markevery behaves with linear and logarithmic scales, as well as with zoomed and polar plots.

Other Python Tutorials you may like