Polar Plots
A polar plot positions each point by an angle and a radius instead of x and y, wrapping your data around a circle — ideal for directions, cycles, and radar-style comparisons.
Learn Polar Plots in our free Matplotlib course — a beginner-friendly interactive lesson with worked examples, a practice exercise and a quick reference.
Part of the free Matplotlib course at LearnCodingFast — hands-on lessons with examples you run in your browser, plus practice exercises and a quick quiz.
In this lesson you'll create polar axes, plot curves with theta and r, build a polar bar (radar-style) chart, and control the angle direction, offset, and radial ticks.
What You'll Learn in This Lesson
1 Creating Polar Axes
Polar plots live on special axes. Create them by passing subplot_kw={"projection": "polar"} to plt.subplots() . Then plot as usual, but the first argument is the angle theta in radians and the second is the radius r . The result wraps around a circle instead of running along a straight axis.
What you'll see: a symmetrical flower-like curve with several petals radiating from the center. The angular gridlines fan out like spokes and the circular gridlines mark the radius, giving the plot its distinctive round frame.
2 Polar Bars: Radar-Style Charts
Call ax.bar() on polar axes and each bar becomes a wedge fanning out from the center — a layout that reads like a radar or wind-rose chart. Space the categories evenly around the circle with np.linspace(0, 2 * np.pi, n, endpoint=False) , then label each angle with ax.set_xticks() and ax.set_xticklabels() .
What you'll see: six green wedges spreading out from the center like slices of a fan, each reaching a different distance based on its stat. The category names sit around the rim, making it easy to spot that Defense (the longest wedge) is this player's strength.
3 Direction, Offset & Radial Ticks
By default zero degrees points right and angles grow counter-clockwise — but compasses and clocks don't work that way. Use ax.set_theta_zero_location("N") to put zero at the top and ax.set_theta_direction(-1) to sweep clockwise. Tidy up the radius with ax.set_rticks() and cap it with ax.set_rmax() .
What you'll see: a wind rose where North sits at the very top and the directions run clockwise N to E to S to W, just like a real compass. The blue wedges show wind strength per direction, and the radial rings are labeled at 2, 4, 6, and 8.
🎯 Your Turn: Fill in the Blanks
Replace each ___ to create polar axes and plot a spiral that runs clockwise.
📋 Common Errors & Quick Reference
You forgot the projection. Pass subplot_kw={"projection": "polar"} to plt.subplots() .
Angles must be in radians . Convert degrees with np.radians(deg) or build them from np.pi .
Use endpoint=False in np.linspace so the last angle doesn't duplicate the first.
Call
What It Does
subplot_kw={"projection":"polar"}
Make polar axes
ax.plot(theta, r)
Curve by angle and radius
ax.bar(angles, vals)
Radar-style wedges
ax.set_theta_zero_location("N")
Move the zero angle
ax.set_theta_direction(-1)
Sweep clockwise
🎯 Mini-Challenge: Compare Two Players
Draw a radar-style line chart comparing two players across six skills. Close each loop so the shapes connect all the way around.
❓ Frequently Asked Questions
Lesson complete — you can plot around a circle!
You created polar axes, plotted curves with theta and r, built radar-style polar bars, and controlled the zero location, direction, and radial ticks to match real-world conventions.
🚀 Up next: Density: hexbin & hist2d — visualize where points pile up.
Practice quiz
How do you create polar axes with plt.subplots()?
- plt.subplots(polar=True)
- plt.subplots(subplot_kw={'projection': 'polar'})
- plt.subplots(kind='polar')
- plt.subplots(mode='polar')
Answer: plt.subplots(subplot_kw={'projection': 'polar'}). Pass subplot_kw={'projection': 'polar'} to make the axes polar.
On polar axes, what is the first argument to ax.plot(theta, r)?
- The angle theta
- The radius r
- The x coordinate
- The color
Answer: The angle theta. The first argument is the angle theta (in radians), the second is the radius.
What units does Matplotlib expect for polar angles?
- Degrees
- Gradians
- Radians
- Percent
Answer: Radians. Polar angles are in radians; a full circle is 2*np.pi.
Which call moves the zero angle to the top of the plot?
- ax.set_rmax('N')
- ax.set_theta_offset('N')
- ax.set_theta_zero_location('N')
- ax.set_zero('top')
Answer: ax.set_theta_zero_location('N'). ax.set_theta_zero_location('N') puts the 0 angle at the top.
How do you make angles increase clockwise?
- ax.set_theta_direction(-1)
- ax.set_clockwise(True)
- ax.set_theta_zero_location(-1)
- ax.reverse_theta()
Answer: ax.set_theta_direction(-1). ax.set_theta_direction(-1) sweeps clockwise instead of counter-clockwise.
Why use endpoint=False in np.linspace for polar categories?
- To speed up plotting
- To stop the last angle duplicating the first
- To use degrees instead of radians
- To reverse the direction
Answer: To stop the last angle duplicating the first. endpoint=False keeps categories evenly spaced without a doubled wedge at the top.
Which method draws radar-style wedges on polar axes?
- ax.wedge()
- ax.radar()
- ax.bar()
- ax.pie()
Answer: ax.bar(). Calling ax.bar() on polar axes draws wedges fanning out from the center.
Which call sets which radial rings are labeled?
ax.set_rticks() chooses the radial tick positions.
By default, where does zero degrees point on polar axes?
- Up (north)
- Down (south)
- Left (west)
- Right (east)
Answer: Right (east). By default 0 points right and angles grow counter-clockwise.
What does ax.set_rmax() do?
- Sets the max angle
- Caps the maximum radius
- Sets the marker size
- Reverses the radius
Answer: Caps the maximum radius. ax.set_rmax() limits the largest radius shown on the plot.
Continue this course
- Previous: Stem, Step & Stair Plots
- Next: Density: hexbin & hist2d