Data Visualization is about visualizing data the right way.
Interactive business dashboards tend to have a special challenge: the must display data with accurate labels, regardless of how the data changes from day to day. Many infographics visualizations are using static data – and therefor the labels can be put on the most convenient location. But what happens when the data changes – either due to new data, or filtering? Labels will overlap, disappear, and/or get mixed up.

The funnel chart is one type of visualization that’s especially prone to this, even with just a few data marks. While working on one, I came up with a solution to keep all the labels nice and clear, no matter what the data throws at it. Bonus: it’s flexible enough for easy customization!
The Problem
Starting with a funnel-chart is easy:
If the values of two funnels-steps are close to each other the labels will overlap:


The problem isn’t about bad data – it is about being flexible in handling the day-to-day data.
The Solution Theory
The idea of the solution to this problem is simple: just add some space between the labels! But how much space? And what the data changes even more? And what if we don’t need the extra space on a certain day?
So the goal is to design a solution that labels each part of the funnel clearly, without the labels overlapping—no matter what the data looks like.
In my search I came up with these principles:
- The label of the last value (last part of the funnel) is the starting point. This label is on the same level (‘height’) as the value itself
- The second-to-last label is positioned:
- If the value doesn’t overlap the next (last) label, show it on the same level as the value in the viz.
- If the value gets too close to the next label, shift the label up.
- Since it is impossible for Tableau to know the exact height of the label, a parameter is used to define the minimum width.
- This needs to be done for every label – and going ‘up’ in the funnel it is necessary to take all the previous padding into account: if 5 pixels are added to the 4th step, the 1st, 2nd and 3rd also need this padding on top of each own padding.
- But if possible (if space allows), the label should be placed on its original position (at the same height as the value in the viz).
Funnels: Circle and Square in 21 map layers
The funnel which I am going to label consists of 5 or 6 steps (depending on the data). I created multiple versions with each 10 variations of the data. Without using Dynamic Zone Visibility I was still able to create two different funnel visualizations, which can be selected by a parameter (have a look at the workbook for details).


This visualization uses in total 21 (!) map layers. This doesn’t affect the performance that much, since the data itself is rather small (working on aggregates).
The Numbers
- 6 squares or circles: 1 for every funnel step, using mark type polygon (5 marks per square, 100 per circle )
- 6 titles (legend) on the right, mark type circle
- 6 lines from top of the square/circle to the legend, map as marktype
- 3 ‘helper’ layers to add some space on the top, left and right, circle as mark type
The data is scaffold-ed with a table of numbers 1-100. See my previous blogpost on that. That post is all about creating the visualization – this one is about correct labeling.
Some useful extras
As a bonus I added options to the dashboard:
- Change the base color of the dashboard to green, blue, red or gray
- Shuffle the variations by clicking on a button
- Changing the labels to with or without percentage values
- Changing between the square and circle type visualizations using buttons which represent the exact look and feel of the large funnels.
The solution – in practice
It required quite some thinking to make this work, but Tableau proved again to be flexible enough to make this work:
- To control the spacing between the labels I created a parameter ([MinSpacing]). By using a minimum (0), a maximum (0.25) and a step size (0.01) I can add a slider with buttons (which I usually don’t like, but seems to work for this solution)
An extra [Multiply Factor] helps us getting the spacing - For every step (step 1 > 2, step 2 > 3, etc) I created a calculated field which returns TRUE if the value between the two steps are ‘too small’
- The exact location of the label is created using MAKEPOINT as a Tableau Map-layer.
First we define the default location – the height of the corresponding value. Then we add the value of MinSpacing to every step – but only if the difference between these steps is too small (based on previous calculation)
This is just a short overview of the calculations – have a look at the workbook itself for all the calculations and settings using map layers, parameters and calculations for the labels, and the parameter actions and dashboard layout for all the other functions!
The Result
Try this ‘responsive label’ solution yourself on Tableau Public – and download it to re-create it.
Do you like