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
Implementation
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.