data-visualization
📋 Copy All Matplotlib Commands
📄 Generate Matplotlib PDF Guide
Matplotlib Cheatsheet
Installation
Platform
Command
Ubuntu/Debian
sudo apt install python3-matplotlib or pip3 install matplotlib
RHEL/Fedora
sudo dnf install python3-matplotlib or pip3 install matplotlib
macOS
brew install matplotlib or pip3 install matplotlib
Windows
pip install matplotlib
Conda (All)
conda install matplotlib
Virtual Env
python -m venv myenv && source myenv/bin/activate && pip install matplotlib
With All Features
pip install matplotlib[all]
Verify Install
python -c "import matplotlib; print(matplotlib.__version__)"
Basic Commands
Command
Description
import matplotlib.pyplot as plt
Import pyplot module (standard convention)
plt.plot(x, y)
Create a basic line plot
plt.scatter(x, y)
Create a scatter plot
plt.bar(x, height)
Create a vertical bar chart
plt.barh(y, width)
Create a horizontal bar chart
plt.hist(data, bins=30)
Create a histogram with 30 bins
plt.xlabel('Label')
Set x-axis label
plt.ylabel('Label')
Set y-axis label
plt.title('Title')
Set plot title
plt.legend()
Display legend for labeled data
plt.grid()
Add grid lines to plot
plt.xlim(min, max)
Set x-axis limits
plt.ylim(min, max)
Set y-axis limits
plt.show()
Display the plot in a window
plt.savefig('file.png')
Save plot to file
plt.close()
Close current figure and free memory
plt.figure(figsize=(10, 6))
Create new figure with size in inches
fig, ax = plt.subplots()
Create figure and single axes (OO interface)
fig, axes = plt.subplots(2, 2)
Create 2x2 grid of subplots
plt.subplot(2, 2, 1)
Create subplot in 2x2 grid, position 1
Plot Customization
Command
Description
plt.plot(x, y, 'r--')
Red dashed line (color + linestyle shorthand)
plt.plot(x, y, linewidth=2)
Set line width
plt.plot(x, y, color='#FF5733')
Set color using hex code
plt.plot(x, y, marker='o')
Add circular markers at data points
plt.plot(x, y, markersize=10)
Set marker size
plt.plot(x, y, alpha=0.5)
Set transparency (0=transparent, 1=opaque)
plt.plot(x, y, label='Data')
Add label for legend
plt.scatter(x, y, s=100, c=colors)
Scatter with size and color arrays
plt.scatter(x, y, cmap='viridis')
Use colormap for scatter colors
plt.xticks(rotation=45)
Rotate x-axis tick labels 45 degrees
plt.xticks([0, 1, 2], ['A', 'B', 'C'])
Set custom tick positions and labels
plt.grid(alpha=0.3, linestyle='--')
Customize grid appearance
plt.legend(loc='upper right')
Position legend in specific location
plt.tight_layout()
Adjust spacing to prevent label overlap
plt.axis('equal')
Equal aspect ratio for x and y axes
Advanced Usage
Command
Description
plt.errorbar(x, y, yerr=err)
Plot with error bars
plt.fill_between(x, y1, y2)
Fill area between two curves
plt.contour(X, Y, Z)
Create contour plot from 2D data
plt.contourf(X, Y, Z, levels=20)
Filled contour plot with 20 levels
plt.imshow(data, cmap='hot')
Display 2D array as image/heatmap
plt.colorbar()
Add colorbar to current plot
plt.boxplot(data)
Create box and whisker plot
plt.violinplot(data)
Create violin plot (distribution shape)
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
Pie chart with percentage labels
ax.twinx()
Create second y-axis sharing same x-axis
plt.semilogx(x, y)
Plot with logarithmic x-axis
plt.semilogy(x, y)
Plot with logarithmic y-axis
plt.loglog(x, y)
Plot with both axes logarithmic
plt.step(x, y, where='mid')
Step plot with steps at midpoints
plt.stem(x, y)
Create stem plot (lollipop chart)
plt.hexbin(x, y, gridsize=30)
Hexagonal binning plot
plt.streamplot(X, Y, U, V)
Streamlines for vector field
plt.quiver(X, Y, U, V)
Arrow plot for vector field
ax.set_xscale('log')
Set x-axis to logarithmic scale (OO)
ax.annotate('text', xy=(x,y))
Add annotation at specific point
3D Plotting
Command
Description
from mpl_toolkits.mplot3d import Axes3D
Import 3D plotting toolkit
ax = fig.add_subplot(111, projection='3d')
Create 3D axes
ax.plot3D(x, y, z)
3D line plot
ax.scatter3D(x, y, z)
3D scatter plot
ax.plot_surface(X, Y, Z)
3D surface plot
ax.plot_wireframe(X, Y, Z)
3D wireframe plot
ax.contour3D(X, Y, Z)
3D contour plot
ax.set_xlabel('X')
Set 3D x-axis label
ax.view_init(elev=30, azim=45)
Set 3D viewing angle
Object-Oriented Interface
Command
Description
fig, ax = plt.subplots()
Create figure and axes objects
ax.plot(x, y)
Plot using axes object
ax.set_xlabel('Label')
Set x-axis label (OO method)
ax.set_ylabel('Label')
Set y-axis label (OO method)
ax.set_title('Title')
Set title (OO method)
ax.set_xlim(min, max)
Set x-axis limits (OO method)
ax.set_ylim(min, max)
Set y-axis limits (OO method)
ax.legend()
Add legend (OO method)
ax.grid(True)
Enable grid (OO method)
ax.set_aspect('equal')
Set aspect ratio
fig.suptitle('Main Title')
Set overall figure title
fig.tight_layout()
Adjust subplot spacing
ax.spines['top'].set_visible(False)
Hide top spine/border
ax.tick_params(labelsize=12)
Customize tick parameters
Configuration
Runtime Configuration (rcParams)
import matplotlib.pyplot as plt
# Set default figure size
plt . rcParams [ 'figure.figsize' ] = ( 10 , 6 )
# Set default DPI
plt . rcParams [ 'figure.dpi' ] = 100
# Set default font size
plt . rcParams [ 'font.size' ] = 12
# Set default line width
plt . rcParams [ 'lines.linewidth' ] = 2
# Set default colormap
plt . rcParams [ 'image.cmap' ] = 'viridis'
# Use LaTeX for text rendering
plt . rcParams [ 'text.usetex' ] = True
# Set backend
plt . rcParams [ 'backend' ] = 'TkAgg'
Style Sheets
# Use built-in style
plt . style . use ( 'seaborn-v0_8' )
plt . style . use ( 'ggplot' )
plt . style . use ( 'dark_background' )
# List available styles
print ( plt . style . available )
# Use multiple styles (later ones override earlier)
plt . style . use ([ 'seaborn-v0_8' , 'seaborn-v0_8-poster' ])
# Temporary style context
with plt . style . context ( 'dark_background' ):
plt . plot ( x , y )
Configuration File (matplotlibrc)
Create ~/.config/matplotlib/matplotlibrc (Linux/macOS) or %USERPROFILE%\.matplotlib\matplotlibrc (Windows):
# Figure properties
figure.figsize: 10, 6
figure.dpi: 100
# Font properties
font.size: 12
font.family: sans-serif
# Line properties
lines.linewidth: 2
lines.markersize: 8
# Grid properties
grid.alpha: 0.3
grid.linestyle: --
# Legend properties
legend.frameon: False
legend.loc: best
# Axes properties
axes.grid: True
axes.titlesize: 14
axes.labelsize: 12
Common Use Cases
Use Case 1: Multiple Line Plots with Legend
import matplotlib.pyplot as plt
import numpy as np
# Generate data
x = np . linspace ( 0 , 10 , 100 )
y1 = np . sin ( x )
y2 = np . cos ( x )
y3 = np . sin ( x ) * np . exp ( - x / 10 )
# Create plot
plt . figure ( figsize = ( 10 , 6 ))
plt . plot ( x , y1 , 'b-' , label = 'sin(x)' , linewidth = 2 )
plt . plot ( x , y2 , 'r--' , label = 'cos(x)' , linewidth = 2 )
plt . plot ( x , y3 , 'g-.' , label = 'damped sin(x)' , linewidth = 2 )
# Customize
plt . xlabel ( 'X axis' , fontsize = 12 )
plt . ylabel ( 'Y axis' , fontsize = 12 )
plt . title ( 'Trigonometric Functions' , fontsize = 14 )
plt . legend ( loc = 'upper right' )
plt . grid ( True , alpha = 0.3 )
# Save and display
plt . savefig ( 'trig_functions.png' , dpi = 300 , bbox_inches = 'tight' )
plt . show ()
Use Case 2: Subplots with Different Plot Types
import matplotlib.pyplot as plt
import numpy as np
# Generate data
x = np . linspace ( 0 , 10 , 50 )
y = 2 * x + 1 + np . random . randn ( 50 ) * 2
categories = [ 'A' , 'B' , 'C' , 'D' ]
values = [ 23 , 45 , 56 , 78 ]
# Create 2x2 subplot grid
fig , axes = plt . subplots ( 2 , 2 , figsize = ( 12 , 10 ))
# Scatter plot
axes [ 0 , 0 ] . scatter ( x , y , alpha = 0.6 )
axes [ 0 , 0 ] . set_title ( 'Scatter Plot' )
axes [ 0 , 0 ] . set_xlabel ( 'X' )
axes [ 0 , 0 ] . set_ylabel ( 'Y' )
# Line plot
axes [ 0 , 1 ] . plot ( x , np . sin ( x ), 'r-' , linewidth = 2 )
axes [ 0 , 1 ] . set_title ( 'Line Plot' )
axes [ 0 , 1 ] . grid ( True )
# Bar chart
axes [ 1 , 0 ] . bar ( categories , values , color = 'skyblue' , edgecolor = 'black' )
axes [ 1 , 0 ] . set_title ( 'Bar Chart' )
axes [ 1 , 0 ] . set_ylabel ( 'Values' )
# Histogram
axes [ 1 , 1 ] . hist ( y , bins = 15 , color = 'green' , alpha = 0.7 , edgecolor = 'black' )
axes [ 1 , 1 ] . set_title ( 'Histogram' )
axes [ 1 , 1 ] . set_xlabel ( 'Value' )
# Adjust layout and save
plt . tight_layout ()
plt . savefig ( 'subplots_example.png' , dpi = 300 )
plt . show ()
Use Case 3: Heatmap with Colorbar
import matplotlib.pyplot as plt
import numpy as np
# Generate 2D data
data = np . random . randn ( 10 , 10 )
# Create heatmap
fig , ax = plt . subplots ( figsize = ( 8 , 6 ))
im = ax . imshow ( data , cmap = 'RdYlBu_r' , aspect = 'auto' )
# Add colorbar
cbar = plt . colorbar ( im , ax = ax )
cbar . set_label ( 'Values' , rotation = 270 , labelpad = 20 )
# Customize ticks
ax . set_xticks ( np . arange ( 10 ))
ax . set_yticks ( np . arange ( 10 ))
ax . set_xticklabels ([ f 'Col { i } ' for i in range ( 10 )])
ax . set_yticklabels ([ f 'Row { i } ' for i in range ( 10 )])
# Rotate x-axis labels
plt . setp ( ax . get_xticklabels (), rotation = 45 , ha = 'right' )
# Add title
ax . set_title ( 'Heatmap Example' )
plt . tight_layout ()
plt . savefig ( 'heatmap.png' , dpi = 300 , bbox_inches = 'tight' )
plt . show ()
Use Case 4: Time Series with Dual Y-Axes
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# Generate time series data
dates = pd . date_range ( '2023-01-01' , periods = 100 )
temperature = 20 + 10 * np . sin ( np . linspace ( 0 , 4 * np . pi , 100 )) + np . random . randn ( 100 )
humidity = 60 + 20 * np . cos ( np . linspace ( 0 , 4 * np . pi , 100 )) + np . random . randn ( 100 ) * 5
# Create figure with primary axis
fig , ax1 = plt . subplots ( figsize = ( 12 , 6 ))
# Plot temperature on primary y-axis
color = 'tab:red'
ax1 . set_xlabel ( 'Date' )
ax1 . set_ylabel ( 'Temperature (°C)' , color = color )
ax1 . plot ( dates , temperature , color = color , linewidth = 2 , label = 'Temperature' )
ax1 . tick_params ( axis = 'y' , labelcolor = color )
# Create secondary y-axis
ax2 = ax1 . twinx ()
color = 'tab:blue'
ax2 . set_ylabel ( 'Humidity (%)' , color = color )
ax2 . plot ( dates , humidity , color = color , linewidth = 2 , linestyle = '--' , label = 'Humidity' )
ax2 . tick_params ( axis = 'y' , labelcolor = color )
# Add title and grid
plt . title ( 'Temperature and Humidity Over Time' )
ax1 . grid ( True , alpha = 0.3 )
# Format x-axis dates
fig . autofmt_xdate ()
plt . tight_layout ()
plt . savefig ( 'dual_axis_timeseries.png' , dpi = 300 )
plt . show ()
Use Case 5: Statistical Visualization with Error Bars
import matplotlib.pyplot as plt
import numpy as np
# Generate data with error
x = np . arange ( 0 , 10 , 1 )
y = 2 * x + 5
error = np . random . uniform ( 0.5 , 2.0 , len ( x ))
# Create error bar plot
fig , ax = plt . subplots ( figsize = ( 10 , 6 ))
ax . errorbar ( x , y , yerr = error , fmt = 'o-' , capsize = 5 , capthick = 2 ,
ecolor = 'red' , linewidth = 2 , markersize = 8 ,
label = 'Measured Data' )
# Add fitted line
z = np . polyfit ( x , y , 1 )
p = np . poly1d ( z )
ax . plot ( x , p ( x ), 'g--' , linewidth = 2 , label = 'Fitted Line' )
# Customize
ax . set_xlabel ( 'X Variable' , fontsize = 12 )
ax . set_ylabel ( 'Y Variable' , fontsize = 12 )
ax . set_title ( 'Measurements with Error Bars' , fontsize = 14 )
ax . legend ()
ax . grid ( True , alpha = 0.3 )
plt . tight_layout ()
plt . savefig ( 'error_bars.png' , dpi = 300 )
plt . show ()
Best Practices
Use Object-Oriented Interface : For complex plots, use fig, ax = plt.subplots() instead of pyplot state machine for better control and clarity
Close Figures : Call plt.close() after saving plots in scripts to free memory, especially when generating many plots
Set Figure Size Early : Define figsize when creating figures to ensure proper layout before adding elements
Use Vectorized Formats : Save publication figures as PDF or SVG (plt.savefig('plot.pdf')) for scalability and quality
Leverage Style Sheets : Use plt.style.use() for consistent styling across multiple plots instead of setting parameters individually
Label Everything : Always include axis labels, titles, and legends to make plots self-explanatory
Use Tight Layout : Call plt.tight_layout() or bbox_inches='tight' when saving to prevent label cutoff
Choose Appropriate Colormaps : Use perceptually uniform colormaps like 'viridis', 'plasma', or 'cividis' for scientific data
Optimize DPI : Use dpi=300 for print quality, dpi=100 for screen display to balance quality and file size
Batch Processing : When creating multiple plots, wrap in functions and use context managers to ensure proper resource cleanup
Troubleshooting
Issue
Solution
Plot doesn't display
Call plt.show() at the end, or check if running in non-interactive environment. Use plt.ion() for interactive mode
"Matplotlib is currently using agg" backend error
Install GUI backend: pip install pyqt5 or set backend: plt.switch_backend('TkAgg')
Labels cut off when saving
Use plt.tight_layout() before saving or plt.savefig('file.png', bbox_inches='tight')
Memory leak in loop
Call plt.close() or plt.close('all') after each plot to free memory
Import error on macOS
Reinstall with framework build: pip uninstall matplotlib && pip install matplotlib or use conda
Blurry plots
Increase DPI: plt.savefig('plot.png', dpi=300) or set plt.rcParams['figure.dpi'] = 300
Unicode/LaTeX errors
Disable LaTeX: plt.rcParams['text.usetex'] = False or install LaTeX distribution
Slow rendering
Reduce data points, use rasterized=True for large scatter plots, or switch backend
Legend overlaps data
Use plt.legend(loc='best') for auto-positioning or bbox_to_anchor for manual placement
Subplot spacing issues
Use plt.tight_layout() or manually adjust with plt.subplots_adjust(hspace=0.3, wspace=0.3)
Color not changing
Check if using correct parameter name: color or c, ensure color string is valid
3D plot not working
Import toolkit: from mpl_toolkits.mplot3d import Axes3D and use projection='3d'