Lollipop charts: the search for the perfect mark (part one)

Here’s the problem: I am visualising satisfaction rates over multiple dimensions. In almost all cases, satisfaction rates are high (between 70% and 100%). I want a visualisation that allows comparison over multiple dimensions that is also nice on the eye. Below is the result: a lollipop chart. Although I stumbled across this design by trial and error in Tableau, it is a chart type found elsewhere, eg on Chandoo’s excellent Excel blog. What I thought I would do in this post is explain why I think it’s a great chart in this situation and how to do it in Tableau. Note: in this post, I’m using the Superstore data, not my real dataset. In my next post, I’ll explain how to build a lollipop in Tableau. If you can’t wait that long, you could try it yourself as your homework 🙂

To me, it’s a great way to reduce the data-ink ratio while retaining readability. What do you think? Here’s how I arrived at this design.

Tableau’s default visualisation is the bar. What’s the problem with this? Well, when the bars are all very long (as is the case with my data), there’s just too much ink, and it creates an unpleasant Moire effect:

How can we solve this? Well, we can reduce the bars to wafer thin ones, but this looks, well, flakey:

Maybe we should push the size slider to the max (and add a border). This is what I would normally do in this situation. It removes the Moire effect, and isn’t too bad, but boy, there’s now a lot of ink being used:

Given there’s too much ink, maybe the bar itself is the problem. So how does a circle work? Well, the problem is that the circle is a long long way away from the label. When we try and foist this kind of thing on our users, they tell us it’s too hard to relate the circle to the name, even using shaded lines:

We can get round this distance problem in a couple of ways. One is to fix the axis so that it’s range is only as wide as the min/max values:

But we all know that an axis that doesn’t start at zero is a bad thing, right? Well, sometimes it isn’t a bad thing, but it sure makes the states at the bottom of the list look like poor performers, even though they’re actually only 0.6% lower than the top of the list. Best in this case to keep the axis starting at zero. Maybe we could label the circle directly instead:

This still isn’t right: all that white space at the left of the chart seems wrong.

And this was when I had my brainwave. Thick bars are no good and lonely circles are no good. How about making a combination of them both? And that’s how I came up with a lollipop.I think it has the following benefits:

  1. Can be used when all dimension members have high values (i.e. long/tall bars in a bar chart)
  2. Greatly reduces the data-ink ratio while maintaining a clear link to axis labels
  3. All the users I’ve shown it to so far have really engaged with it – they think it’s both pretty and easy to read

I also like the fact that it works if you add more dimensions to make small multiples:

Next time we’ll look at how to build it in Tableau. In the meantime, let me know your thoughts.


Add Yours →

Andy, I really like them. I’ve struggled with the density of bar charts for a while – this solution is really elegant. Now to figure out how you did it…


Neat idea.

When we did the page history feature, we knew it wouldn’t work as for bar charts as some other chart types, but I think it might work quite well with lollipops. I’d be interested to hear what you think.


Kev: nail hit squarely on the head. It’s actually a simple thing to set up, really. I didn’t put the instructions in this post because it was getting too long. Tutorial next week!

Bad news on page history – I just tried to add MY(Order Date) page history to my worksheet and when I pressed play, Tableau fell over! Support call raised…

Hi David
Good stuff. I was pretty sure it would turn out to be something other than just page history causing the crash. The workbook I am working on for real has some pretty complex calculated fields going on – it doesn’t surprise me something breaks along the way…

Anyway, now we’ve all established you can show page history with a lollipop, does it help the analytics? I’m not sure – it’s very hard to see the trend of the recent values, whether they are up or down. Maybe with some more configuration of the Page History formats that could be enhanced, but I think it would quite a challenge. I do have a viz technique called Dribble Charts that I was shown by @aknock that I keep meaning to blog about. It incorporates size into the history, and does show trends over time very well when you are ranking data as in the example above.



It doesn’t tell you a great deal about the wider trends/chronology, but I guess it does show where the current value sits in relation to prior values – an indication of the range involved. For example in the one I’ve done you can see the majority of them are pretty stable over time – Germany especially so, whilst Italy is clearly declining. You’d probably not chose it where the time was critical, but I think it does add something…


Thanks for these examples, everyone. I’ve adapted the lollipop chart and really like it–any idea how we could display the timeframe that currently is in the pages shelf?

Leave a Reply