January 1, 2022

Circular Bar Charts: Why You Should Make Them But Never Share Them

By Luke Stanke

It’s time to deep dive into a data visualization foundation: Bar charts! In this article, we will deep dive into the allure of Circular Bar Charts and help you understand why they’re not always the best fit for your data viz.

Take a look at these four chart types. Which type accurately depicts the values on the chart?

The answer is that all of them are TECHNICALLY correct. 

Each visualization above is simply a projection of some value across a visual space. And while the projections distort our view of the data, they are still an accurate representation. Each projection has its pros and cons.

Consider these plots in the same way you would think about maps. Each world map below is showing you the same information. Depending on what detail you’re seeking, some of the map projections are much easier to read than others. 

But just because they all accurately portray the world doesn’t mean they should all be used interchangeably.

This rule of thumb should apply to your charts too! Don’t worry- we’re going to dive into each one of the charts first introduced in this article to help you  understand their best use.

With the basic Bar Chart, shown below, the projection is rather simple. We are just looking at the value in a standardized 1-dimensional view (the x-axis).

Now, the Curvy-Bar charts uses the same x-axis as the bar charts but then uses a second dimension (on the y-axis) to distort the view. This distortion is consistent from bar-to-bar so it does show a correct visualization. 

In the circular bar charts, we used two different ways to standardize our visualizations. While a bar chart clearly articulates the data, the circular bar charts offer the visual appeal of a circle– AND WHO CAN PASS UP THE VISUAL APPEAL OF A CIRCLE?! 

The Radian-Correct Bar Chart visualization, shown above, uses radians (or degrees) in a circle to size the lengths of the bars. These bars are perfectly accurate using radians, but the overall length of the bars do not match. 

This is because the distance is calculated using the circumference calculation of 2πr. This also means that the outermost bars will will be proportionally larger if they travel an equal distance.

We see this all the time with the Olympics in track events. The 400m and 200m have staggered starts to account for the distance around the circle.

This means with the radians-based circular bar charts the distances that we are seeing are distorted. We can adjust these charts by using distance-based circular bar charts.

The Distance-Correct Bar Chart is shown below. It demonstrates what a distance-based circular bar chart looks like using the exact same data.

Even when the circular bars are sorted from largest to smallest we are left the bar lengths do not appear to be sorted from largest to smallest (even though they are). This is because of the properties of a circle. You have to travel further on the outside!

So which one of these four charts is correct? I asked the data analytics community on Twitter and I was actually surprised that so many people selected the radians-based solution.

But just because they all accurately portray the data doesn’t mean they all should be used. And the circular bar charts shown above showcase exactly why: they are difficult to interpret.

All this said: it’s STILL worth learning how to make both chart types because it’ll allow you to practice advanced concepts in Tableau: Data Densification, Use of SIN() and COS() functions to draw circles, and Table Calculations!

If you are undeterred and still want to make these chart types be sure to check out one of Data Coach’s Tableau Tutorials on YouTube.

Tutorial: Radians-Based Circular Bar Chart

Step #1: The Data

Join a placeholder dataset to your existing dataset using custom joins where 1 = 1. This custom dataset should be a single column of data that counts up by 1 from 0 to 200. The larger you make this value the more granular your visualization. For our example, we call this column Value.

In this example, we use Sample – Superstore and use the Orders table.

Step #2: The Calculations

You will need 6 calculations.

Create a calculation called Index | Sub. This will be used to calculate the radius.

					// Index Sub

Create a calculation called % Value. This will normalize our data between 0 and 1.

					// % Value

For this example we create a bar chart using Sales by Sub-Category. Create a calculation that normalizes sales for subcategory between 0 and 1.

					// % Sales
{FIXED [Sub-Category] : SUM([Sales])}
{MAX({FIXED [Sub-Category] : SUM([Sales])})}

Create a calculation called Percent Filter using % Sales and % Value that will be used to filter to relevant data.

					// Percent Filter
[% Value] <= [% Sales]

Now you need to create the calculations for rows and columns.

					// Columns
-(1.5 * [Index | Sub]) * SUM(COS(PI() * 1.25 * [% Value]))
					// Columns
-(1.5 * [Index | Sub]) * SUM(COS(PI() * 1.25 * [% Value]))
					// Rows (bottom layer)
(1.5 * [Index | Sub]) * SUM(SIN(PI() * 1.25 * [% Value]))
					// Rows (top layer)
(1.5 * [Index | Sub]) * SUM(SIN(PI() * 1.25 * [% Value]))  
IF MIN([Percent Filter]) THEN 1 END

Step #3: The Build

Add Columns to the columns shelf. Add Rows (bottom layer) and Rows (top layer) to the rows shelf.

Change the marks types to line. Place Value on path as a continuous dimension. Add Sub-Category to detail.

Edit the table calculations for the calculations on your rows and columns shelves. Select specific dimensions and select Sub-Category. Then change the sort order to sort ascending on sum of sales.

On the Rows (bottom layer) marks card add Sales to text. Set the label to show on the end of the lines. Align the text to the middle-left.

On the Rows (top later) marks card, add Sub-Category to text, too. Rotate the text and align to the bottom-center.

Tutorial: Distance-Based Circular Bar Chart

Step #1: The Data

Follow the steps from the previous tutorial above.

Step #2: The Calculations

Create the Index | Sub and % Value calculations from above. For this calculation you need a different % Sales calculation. This starts normalizing our data for distance.

					// % Sales
(MIN({FIXED [Sub-Category] : SUM([Sales])}
{MAX({FIXED [Sub-Category] : SUM([Sales])})})) 
(WINDOW_MAX([Index | Sub])/[Index | Sub])

But it doesn’t get the values between 0 and 1 (at least not guaranteed). So we need to adjust these values with Normalized Circles. 

					// Normalized Circles
([% Sales]/WINDOW_MAX([% Sales])) <= MIN([% Value])

The Columns and Rows (bottom layer) calculations will remain the same but the Rows (top layer) will change.

					// Rows (top layer)
(1.5 * [Index | Sub]) * SUM(SIN(PI() * 1.25 * [% Value]))  
IF [Normalized Circles] THEN 1 END

Step #3: The Build

Follow the steps from the previous tutorial above. When you edit the table calculation for Rows (top layer) make sure you edit all of the nested Table Calculations.

For Index | Sub, select Sub-Category from specific dimensions and sort ascending on sum of sales.

For % Sales, select Sub-Category from specific dimensions.

For % Sales | Normalized, select Sub-Category from specific dimensions.


You can make these charts. Just don’t share them with others.

Ready to add expertise to your data visualization projects? We are ready to help!

Data Coach is our premium analytics training program with one-on-one coaching from renowned experts.

Accelerate and automate your data projects with the phData Toolkit