Matplotlib Histogram Plotting

PythonPythonBeginner
Practice Now

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

Introduction

In this lab, we will learn how to plot histograms with Matplotlib. We will generate data and plot a simple histogram, update histogram colors, plot a 2D histogram, and customize your histogram.

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`"]) 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/histograms("`Histograms`") python/BasicConceptsGroup -.-> python/variables_data_types("`Variables and Data Types`") python/BasicConceptsGroup -.-> python/booleans("`Booleans`") python/ControlFlowGroup -.-> python/for_loops("`For Loops`") python/DataStructuresGroup -.-> python/lists("`Lists`") python/DataStructuresGroup -.-> python/tuples("`Tuples`") python/ModulesandPackagesGroup -.-> python/importing_modules("`Importing Modules`") python/ModulesandPackagesGroup -.-> python/standard_libraries("`Common Standard Libraries`") python/PythonStandardLibraryGroup -.-> python/math_random("`Math and Random`") 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-48767{{"`Matplotlib Histogram Plotting`"}} python/with_statement -.-> lab-48767{{"`Matplotlib Histogram Plotting`"}} matplotlib/importing_matplotlib -.-> lab-48767{{"`Matplotlib Histogram Plotting`"}} matplotlib/figures_axes -.-> lab-48767{{"`Matplotlib Histogram Plotting`"}} matplotlib/histograms -.-> lab-48767{{"`Matplotlib Histogram Plotting`"}} python/variables_data_types -.-> lab-48767{{"`Matplotlib Histogram Plotting`"}} python/booleans -.-> lab-48767{{"`Matplotlib Histogram Plotting`"}} python/for_loops -.-> lab-48767{{"`Matplotlib Histogram Plotting`"}} python/lists -.-> lab-48767{{"`Matplotlib Histogram Plotting`"}} python/tuples -.-> lab-48767{{"`Matplotlib Histogram Plotting`"}} python/importing_modules -.-> lab-48767{{"`Matplotlib Histogram Plotting`"}} python/standard_libraries -.-> lab-48767{{"`Matplotlib Histogram Plotting`"}} python/math_random -.-> lab-48767{{"`Matplotlib Histogram Plotting`"}} python/data_collections -.-> lab-48767{{"`Matplotlib Histogram Plotting`"}} python/numerical_computing -.-> lab-48767{{"`Matplotlib Histogram Plotting`"}} python/data_visualization -.-> lab-48767{{"`Matplotlib Histogram Plotting`"}} python/build_in_functions -.-> lab-48767{{"`Matplotlib Histogram Plotting`"}} end

Generate Data and Plot a Simple Histogram

To generate a 1D histogram, we only need a single vector of numbers. For a 2D histogram, we'll need a second vector. We'll generate both below, and show the histogram for each vector.

import matplotlib.pyplot as plt
import numpy as np

## Create a random number generator with a fixed seed for reproducibility
rng = np.random.default_rng(19680801)

N_points = 100000
n_bins = 20

## Generate two normal distributions
dist1 = rng.standard_normal(N_points)
dist2 = 0.4 * rng.standard_normal(N_points) + 5

fig, axs = plt.subplots(1, 2, sharey=True, tight_layout=True)

## We can set the number of bins with the *bins* keyword argument.
axs[0].hist(dist1, bins=n_bins)
axs[1].hist(dist2, bins=n_bins)

plt.show()

Updating Histogram Colors

The histogram method returns (among other things) a patches object. This gives us access to the properties of the objects drawn. Using this, we can edit the histogram to our liking. Let's change the color of each bar based on its y value.

## N is the count in each bin, bins is the lower-limit of the bin
N, bins, patches = axs[0].hist(dist1, bins=n_bins)

## We'll color code by height, but you could use any scalar
fracs = N / N.max()

## we need to normalize the data to 0..1 for the full range of the colormap
norm = colors.Normalize(fracs.min(), fracs.max())

## Now, we'll loop through our objects and set the color of each accordingly
for thisfrac, thispatch in zip(fracs, patches):
    color = plt.cm.viridis(norm(thisfrac))
    thispatch.set_facecolor(color)

## We can also normalize our inputs by the total number of counts
axs[1].hist(dist1, bins=n_bins, density=True)

## Now we format the y-axis to display percentage
axs[1].yaxis.set_major_formatter(PercentFormatter(xmax=1))

plt.show()

Plot a 2D Histogram

To plot a 2D histogram, one only needs two vectors of the same length, corresponding to each axis of the histogram.

fig, ax = plt.subplots(tight_layout=True)
hist = ax.hist2d(dist1, dist2)

plt.show()

Customizing your Histogram

Customizing a 2D histogram is similar to the 1D case, you can control visual components such as the bin size or color normalization.

fig, axs = plt.subplots(3, 1, figsize=(5, 15), sharex=True, sharey=True,
                        tight_layout=True)

## We can increase the number of bins on each axis
axs[0].hist2d(dist1, dist2, bins=40)

## As well as define normalization of the colors
axs[1].hist2d(dist1, dist2, bins=40, norm=colors.LogNorm())

## We can also define custom numbers of bins for each axis
axs[2].hist2d(dist1, dist2, bins=(80, 10), norm=colors.LogNorm())

plt.show()

Summary

In this lab, we learned how to plot histograms with Matplotlib. We generated data and plotted a simple histogram, updated histogram colors, plotted a 2D histogram, and customized our histogram. We can use these techniques to visualize and analyze data in a variety of contexts.

Other Python Tutorials you may like