Bird
Raised Fist0
Matplotlibdata~10 mins

Discrete colorbars in Matplotlib - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Discrete colorbars
Define color levels
↓
Create colormap with discrete colors
↓
Normalize data to levels
↓
Plot data with colormap
↓
Add colorbar with discrete ticks
↓
Display plot
This flow shows how to create a colorbar with distinct color segments by defining levels, mapping colors discretely, and displaying the colorbar.
Execution Sample
Matplotlib
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import BoundaryNorm

levels = [0, 1, 2, 3, 4]
cmap = plt.get_cmap('viridis', len(levels)-1)
norm = BoundaryNorm(levels, cmap.N)

fig, ax = plt.subplots()
img = ax.imshow(np.array([[0.5,1.5],[2.5,3.5]]), cmap=cmap, norm=norm)
fig.colorbar(img, boundaries=levels, ticks=levels)
plt.show()
This code creates a 2x2 image with values mapped to discrete color levels and shows a colorbar with distinct color segments.
Execution Table
StepActionInput/VariableResult/Output
1Define levelslevels = [0,1,2,3,4]Levels set for color boundaries
2Create colormapcmap = viridis with 4 colorsColormap with 4 discrete colors created
3Create normalizationnorm = BoundaryNorm(levels, cmap.N)Normalization maps data to discrete colors
4Prepare datadata = [[0.5,1.5],[2.5,3.5]]Data ready for plotting
5Plot imageimshow with cmap and normImage colored with discrete colors
6Add colorbarcolorbar with boundaries=levels, ticks=levelsColorbar shows 4 discrete color segments
7Display plotplt.show()Plot with discrete colorbar displayed
💡 Plot displayed with discrete colorbar matching defined levels
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3After Step 4After Step 5After Step 6Final
levelsundefined[0,1,2,3,4][0,1,2,3,4][0,1,2,3,4][0,1,2,3,4][0,1,2,3,4][0,1,2,3,4][0,1,2,3,4]
cmapundefinedundefinedviridis with 4 colorsviridis with 4 colorsviridis with 4 colorsviridis with 4 colorsviridis with 4 colorsviridis with 4 colors
normundefinedundefinedundefinedBoundaryNorm objectBoundaryNorm objectBoundaryNorm objectBoundaryNorm objectBoundaryNorm object
dataundefinedundefinedundefinedundefined[[0.5,1.5],[2.5,3.5]][[0.5,1.5],[2.5,3.5]][[0.5,1.5],[2.5,3.5]][[0.5,1.5],[2.5,3.5]]
imgundefinedundefinedundefinedundefinedundefinedAxesImage objectAxesImage objectAxesImage object
Key Moments - 3 Insights
Why do we use BoundaryNorm instead of a simple normalization?
BoundaryNorm maps data values to discrete color intervals defined by levels, ensuring each color segment corresponds exactly to a range, as shown in step 3 of the execution_table.
Why do the colorbar ticks match the levels list?
The colorbar uses the boundaries and ticks parameters set to levels, so each tick aligns with a color segment boundary, as seen in step 6.
What happens if data values fall between levels?
BoundaryNorm assigns colors based on which interval the value falls into, so values like 0.5 map to the first color segment between 0 and 1, demonstrated in step 5.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table step 3. What does BoundaryNorm do with the levels?
ACreates a continuous gradient colormap
BSets the colorbar labels only
CMaps continuous data to discrete color intervals
DNormalizes data between 0 and 1
💡 Hint
Refer to step 3 where norm is created with BoundaryNorm using levels.
At which step is the image data assigned colors based on discrete levels?
AStep 4
BStep 5
CStep 2
DStep 6
💡 Hint
Step 5 shows plotting with imshow using cmap and norm.
If we add a new level 5 to levels, how does the colorbar change?
AIt shows 5 discrete color segments instead of 4
BIt remains with 4 color segments
CIt becomes a continuous gradient
DIt removes all ticks
💡 Hint
Check variable_tracker for levels and cmap size relation.
Concept Snapshot
Discrete colorbars in matplotlib:
- Define levels as boundaries for colors
- Use BoundaryNorm to map data to these levels
- Create colormap with number of colors = len(levels)-1
- Plot data with cmap and norm
- Add colorbar with boundaries and ticks matching levels
- Result: colorbar shows distinct color segments matching data ranges
Full Transcript
This example shows how to create a discrete colorbar in matplotlib. First, we define the levels that separate color segments. Then, we create a colormap with a fixed number of colors matching the intervals between levels. BoundaryNorm is used to map data values to these discrete color intervals. We plot the data using imshow with the colormap and normalization. Finally, we add a colorbar with boundaries and ticks set to the levels, so the colorbar shows distinct color blocks. This helps visualize data categories clearly instead of a smooth gradient.

Practice

(1/5)
1. What is the main purpose of using a discrete colorbar in a matplotlib plot?
easy
A. To increase the size of the plot figure
B. To create a continuous gradient of colors for smooth data
C. To add labels to the x-axis of a plot
D. To show data with distinct color steps for clear category separation

Solution

  1. Step 1: Understand colorbar types

    Continuous colorbars show smooth color changes, while discrete colorbars use fixed color steps.
  2. Step 2: Identify the purpose of discrete colorbars

    Discrete colorbars help separate data into clear categories using distinct colors.
  3. Final Answer:

    To show data with distinct color steps for clear category separation -> Option D
  4. Quick Check:

    Discrete colorbar = distinct color steps [OK]
Hint: Discrete colorbars separate categories with fixed colors [OK]
Common Mistakes:
  • Confusing discrete with continuous colorbars
  • Thinking colorbars change plot size
  • Mixing colorbar purpose with axis labeling
2. Which of the following code snippets correctly creates a discrete colorbar with 3 color steps using matplotlib?
easy
A. cmap = ListedColormap(['red', 'green', 'blue']) norm = Normalize(0, 3)
B. cmap = LinearSegmentedColormap(['red', 'green', 'blue']) norm = Normalize(0, 3)
C. cmap = ListedColormap(['red', 'green', 'blue']) norm = BoundaryNorm([0, 1, 2, 3], cmap.N)
D. cmap = LinearSegmentedColormap(['red', 'green', 'blue']) norm = BoundaryNorm([0, 1, 2, 3], cmap.N)

Solution

  1. Step 1: Identify correct colormap for discrete colors

    ListedColormap is used for discrete colors, LinearSegmentedColormap is for continuous gradients.
  2. Step 2: Check normalization method

    BoundaryNorm with boundaries defines discrete steps; Normalize is for continuous scaling.
  3. Final Answer:

    cmap = ListedColormap(['red', 'green', 'blue'])\nnorm = BoundaryNorm([0, 1, 2, 3], cmap.N) -> Option C
  4. Quick Check:

    ListedColormap + BoundaryNorm = discrete colorbar [OK]
Hint: Use ListedColormap + BoundaryNorm for discrete colorbars [OK]
Common Mistakes:
  • Using Normalize instead of BoundaryNorm
  • Using LinearSegmentedColormap for discrete colors
  • Incorrect boundary list length
3. What will be the output color for a value of 1.5 in this discrete colorbar setup?
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap, BoundaryNorm

cmap = ListedColormap(['yellow', 'orange', 'red'])
norm = BoundaryNorm([0, 1, 2, 3], cmap.N)
color = cmap(norm(1.5))
print(color)
medium
A. (1.0, 1.0, 0.0, 1.0) # yellow color
B. (1.0, 0.647, 0.0, 1.0) # orange color
C. (1.0, 0.0, 0.0, 1.0) # red color
D. (0.5, 0.5, 0.5, 1.0) # gray color

Solution

  1. Step 1: Understand BoundaryNorm mapping

    BoundaryNorm maps values 0-1 to first color (yellow), 1-2 to second (orange), 2-3 to third (red).
  2. Step 2: Find color for value 1.5

    1.5 lies between 1 and 2, so it maps to the second color: orange (RGB approx (1.0, 0.647, 0.0, 1.0)).
  3. Final Answer:

    (1.0, 0.647, 0.0, 1.0) # orange color -> Option B
  4. Quick Check:

    Value 1.5 in 1-2 range = orange [OK]
Hint: Check which boundary interval the value falls into [OK]
Common Mistakes:
  • Choosing first or third color incorrectly
  • Confusing Normalize with BoundaryNorm behavior
  • Misreading boundary intervals
4. Identify the error in this code that tries to create a discrete colorbar with 4 colors:
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap, BoundaryNorm

cmap = ListedColormap(['blue', 'green', 'yellow', 'red'])
norm = BoundaryNorm([0, 1, 2, 3], cmap.N)
plt.colorbar(plt.cm.ScalarMappable(norm=norm, cmap=cmap))
plt.show()
medium
A. Boundary list length should be one more than number of colors
B. ListedColormap cannot have more than 3 colors
C. plt.colorbar requires a continuous colormap
D. ScalarMappable is not compatible with BoundaryNorm

Solution

  1. Step 1: Check boundary list length

    BoundaryNorm boundaries must have length = number of colors + 1 to define intervals correctly.
  2. Step 2: Compare boundaries and colors

    Here, 4 colors but only 4 boundaries given; should be 5 boundaries like [0,1,2,3,4].
  3. Final Answer:

    Boundary list length should be one more than number of colors -> Option A
  4. Quick Check:

    Boundaries = colors + 1 [OK]
Hint: Boundaries count = colors count + 1 for discrete colorbars [OK]
Common Mistakes:
  • Using equal boundaries and colors length
  • Thinking ScalarMappable is incompatible
  • Believing ListedColormap limits colors
5. You have data with 5 categories labeled 0 to 4. You want a discrete colorbar with distinct colors for each category and labels shown on the colorbar ticks. Which approach correctly achieves this in matplotlib?
hard
A. Use ListedColormap with 5 colors, BoundaryNorm with boundaries [0,1,2,3,4,5], and set colorbar ticks at [0.5,1.5,2.5,3.5,4.5] with labels ['0','1','2','3','4']
B. Use LinearSegmentedColormap with 5 colors and Normalize from 0 to 4, then set colorbar ticks at [0,1,2,3,4]
C. Use ListedColormap with 4 colors, BoundaryNorm with boundaries [0,1,2,3,4], and set colorbar ticks at [0,1,2,3]
D. Use ListedColormap with 5 colors, Normalize from 0 to 5, and set colorbar ticks at [0,1,2,3,4]

Solution

  1. Step 1: Set colormap and boundaries for 5 categories

    ListedColormap with 5 colors matches 5 categories; BoundaryNorm boundaries must be length 6 for 5 intervals.
  2. Step 2: Position ticks between boundaries

    Ticks at midpoints like 0.5,1.5,... label categories clearly on discrete colorbar.
  3. Final Answer:

    Use ListedColormap with 5 colors, BoundaryNorm with boundaries [0,1,2,3,4,5], and set colorbar ticks at [0.5,1.5,2.5,3.5,4.5] with labels ['0','1','2','3','4'] -> Option A
  4. Quick Check:

    Boundaries + mid-ticks label discrete categories [OK]
Hint: Use boundaries + midpoints for ticks to label categories [OK]
Common Mistakes:
  • Using continuous colormap for discrete data
  • Setting ticks at boundaries instead of midpoints
  • Mismatching number of colors and boundaries
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard