Matplotlib and error bars in polar coordinates

Recently, I needed to construct a rose plot - or a bar plot in polar coordinates - with error bars. Python’s Matplotlib creates beautiful plots in polar coordinates with the argument projection='polar'. However, error bars are not rendered well in polar coordinates, tilted and distorted. To solve it, I wrote a small function to draw the error bars appropriately – at least according to my expectations and understanding of how error bars should look like in a polar bar plot.

Here is how error bars are rendered:


As shown in the figure above, error bars always remain horizontal (or orthogonal to the $0$ or $\pi$ radians directions), suggesting that Matplotlib is using the same code as that used in euclidian coordinates. There are two error bars that can be defined: radial and angular error. Because the error bars we are constructing refers to the radial variable, one thing to keep in mind is that this is a positive variable and thus is likely to be asymetric. Thus, the first thing we need to do is to define how to properly define the error bars in this context.

Radial error

To represent radial error of the point $( r \pm dr , \theta )$ we will draw by two bars located at $r + dr$ and $r - dr$. Contrary to error bars in euclidean coordinates, each bar should have different lengths: the bar at $r-dr$ should be smaller than that at $r+dr$. This difference is naturally achieved in a polar plot by defining the length of the interval as $2 \Delta \theta$. Thus, for a given point $(r_0, \theta_0)$, we will plot a curve with fixed radius $r_0 \pm dr$ and angle $ \theta \in [ \theta_0 + \Delta, \theta_0 - \Delta \theta ] . $

Especially in the case of a bar plot (as in the figure at the beginning of this post), this will ensure that this curve is orthogonal to the end of the bar.


Angular error


Here is the current implementation.

As an example, I updated the plot from the beginning of this post and here is the final result (find the source code here). In the context of rose plots, the free parameter $\Delta \theta$ can be defined as a function of the bar width.