Tim Kent's Blog

SSRS 2008 – Icon Charts

In my last post I had a bit of a moan about the lack of new data visualisation features in PerformancePoint Services but to be fair MSFT have really turned up the dial on the data visualisation functionality with the release of Excel 2007 and SSRS 2008.  SQL 2008 R2 sees further advances with features such as Sparklines, Data Bars and indicators being far easier to create in SSRS.  There’s still a few things missing from the stack though when compared against some of the pureplay visualisation vendors such as Tableau and Spotfire.

Icon Charts (I’m not actually sure that’s their real name!) are another form of Tufte’s “small multiple” that combines the concepts of lattice/trellis charts and heatmaps.  This type of visualisation utilises the user’s perception of colour (hue) and form (size) to allow analysis of multiple categories with multiple quantitative measures.

I was hoping that it might be possible to do something with the new indicators in R2 and though you can use custom images there’s no simple way to hook them up to the data in terms of size and colour.

In this solution (workaround/hack?) I’m using the matrix object again but rather than using an inline chart I’m simply using a square symbol (letter n) from the wingdings font and then setting the colour (with a sequential palette) and size according to the data.  My example uses hard-coded values in a switch statement in the expression but you could be cleverer than this and make the values percentages of the maximum in your dataset for example.


Add a couple of legends so that the viewer can clearly see what they are looking at.  It’s easy to pick out that SouthWest in Q3 had good revenue but low profit.  Is there a Problem? Add a drillthrough to detail report to allow the user to find out.


As always the sample report can be downloaded from here: IconCharts.rdl (81.36 kb)

Alternatively, e-mail devteam(at)adatis(dot)co(dot)uk for a copy.

Win - Loss Graphs in Reporting Services 2008

As I mentioned previously, SSRS 2008 allows us to use some nice visualisation techniques in our reports.  Win\Loss graphs are used to show (wait for it......) the trend of wins and losses over time.  The usual example is the performance of a sports team during a season, but they are also useful for showing trends over time such as the performance of a KPI.  Here's another quick how-to on building this type of chart in SSRS 2008.

So first we need a dataset with three fields: Series, Time and Value.  The first two are fairly self-explanatory, for the third you need to transform your value so it appears as either a 1, -1 or 0 (win, lose, no result/tie).  The AdventureWorks built-in cube KPI's work well here so I'm going to shortcut slightly and use these.  If you're going to use a relational source you may need to do something a little cleverer.  For example:

        WHEN [SalesAmount] > 10000
        THEN 1
        WHEN [SalesAmount] < 10000
        THEN -1
        WHEN [SalesAmount] IS NULL
        THEN 0
    END AS Winlose

We'll be using AdventureWorks (SSAS) "Internet Revenue" KPI.  Don't forget that when using an AS data source in SSRS you basically have to trick it into thinking it's relational and make sure you have your measures on Columns (as Chris Webb discusses here).  Here's our very simple MDX statement:

    KPITrend("Internet Revenue")
    [Customer].[Customer Geography].[Country].members
    [Adventure Works] 

Now lets add a chart - pick the standard column chart and format as follows:

  1. Right click and delete the chart title and legend;
  2. Right click on both the axis titles uncheck Show Axis Title
  3. Right click on the Y (vertical) axis and select Axis Properties.  Under Axis Options set Minimum to -1, Maximum to 1 and Cross At property to 0 (this makes sure our baseline runs between the "wins" and "losses").  Click OK;
  4. Right click again on the Y axis and uncheck Show Axis;
  5. Right click on the X axis and select Axis Properties.  Under Labels  check Hide Axis Labels and do the same for Major and Minor Tick Marks. Under Line set the width to 0.5 and the colour to light grey or similar.  Click OK.

You should now have something like this:


Now lets add some data:

  1. Drag your Time field from the Report Data pane into the category area;
  2. Drag your Value  field into the Data Field area;
  3. Right click on your series and select Series Properties.  Under Fill set the colour suitably.  In our example we're going to show wins as black and losses as red using a switch statement in an expression:
  4. =Switch
        Fields!Internet_Revenue_Trend.Value = 1, "Black",
        Fields!Internet_Revenue_Trend.Value = -1, "Red"

If you preview the chart now it should look something like this:


To finish off we need to add the chart inline to a table:

  1. Add a table and delete the third column;
  2. Set the DataSetName property to the same as your chart;
  3. Right click on the second row and add a group (using the adjacent above option).  Select your Series value (in our case: Country) from the drop down;
  4. Delete the bottom row;
  5. Drag your Series field into the First column, second cell;
  6. Drag your chart into the second column, second cell.

Finally add a bit of formatting to your table and you're done!


As usual the sample report can be downloaded here: WinLose.rdl (24.08 kb)

This also works in SSRS 2005 - though doesn't render quite a cleanly.

How to: Bullet Charts in Reporting Services 2008

Unlike SSRS 2005 where creating bullet graph takes a bit of jiggery-pokery, Reporting Services 2008 almost has them built-in (thanks the the acquisition of Dundas technology).  I say almost as it's actually using a linear gauge object which in the wrong hands allows you to put the likes of a thermometer on your reports to show just how "hot" your business is!  Luckily, there is a built-in bullet graph template for the gauge but it still requires a bit of customisation to make it look like a bullet graph as per Stephen Few's specifications.  However it's almost all formatting/setup.  Here follows a quick(-ish) how-to.

In most cases you'll be using this type of chart inline in a table, however it's easier to develop the graph object outside of the table then drop it in once you've got the formatting right.  To start with create yourself a datasource and build a dataset that has the following fields and one row for each bullet graph you want to display:

  • Category Name
  • Actual Value
  • Target Value
  • Bad Zone Max
  • Satisfactory Zone Max
  • Good Zone max
  • Optionally you may need a bad zone min if you have negative values

Next drop a gauge object onto your report and select the bullet graph template. 


You'll notice that the default is lots of jazzy shading and spangly borders.  We particularly need to get rid of these if we are using the graph inline as they will make the graph very hard to read when scaled down (and of course add no value in terms of visualising the key information anyway).  We'll also want to remove the scale if we are using inline - we can add it back into our column header later.

Right click on the graph and select gauge properties.  Select the Back fill section and set Gradient to solid and the colour to no colour.  Then select the Frame section and set the style to none.  Close the properties pane. Looking better already:


Next lets remove the scale - right click on the graph again, this time selecting Gauge and then Scale Properties.  Select the Labels section then check the Hide Scale Labels checkbox.  Then select the Major Checkmarks section and check the Hide Major checkmarks checkbox.  At this point also set the start and end margins to 1 in the Layout section and set the Maximum value of the scale to your good zone max field.  Close the properties panel again.  

Now lets deal with each component of the graph.  You'll notice that the orange bar is actually made up of two objects known as linear pointers.   Lets tidy them up and assign our Actual and Target values to those pointers.  First make sure you've set the relevant datasetname property for the graph.  Then right click on your graph again, gauge sub-menu and Pointer(LinearPointer1) properties.   Set the value to be your actual field from your dataset.  The go to the Pointer Fill section, set the fill style to solid and pick a suitable colour for your "bullet".  Set the Pointer width to 30 and finally select the shadow section and set the shadow offset to 0.  Do the same for your target pointer (LinearPointer2) but this time setting a width of 8 and an length of 80.


Now set the relevant properties for each of the zones.  This time select Range(LinearRange1) properties from your Gauge sub-menu.  Set the Start Range to 0 and the End range to your Bad Zone Max field.  Whilst you have the properties pane open, get rid of the range borders by setting the border style to None and the start and end widths to 60.  Repeat for range two but this time setting the Start Range to Bad Zone Max and the End Range to your Satisfactory Zone Max. The same for zone three but this time with Satisfactory Zone Max and Good Zone Max.

Now add a table to your report, set the datasetname to the same dataset as your graph.  Delete the third column and drop your Category field into the second row, first column and then add a grouping on the Category Field (right click on second row, group properties, add).  Then drop your chart into the second column, second cell.  You should have something that looks like this in design view:


Almost there.  One of the quirks of any inline chart is that it overrides the border of the cell it's placed in so you need to set the border for the GaugePanel to the same as your cell borders.  Finally lets add a scale to the header of column two.  Copy your chart from the cell and then paste it the header.  Remove all the components except the scale from the gauge panel by carefully highlighting and deleting.  Right click the Gauge in your header and select scale properties from the sub-menu.  Uncheck the Hide Scale Labels checkbox and the Hide Major checkmarks checkbox.  For the max value of the scale you need to make sure you use the max grouping for you good zone max rather than the default sum (=Max(Fields!Zone3.Value)).  In the layout section, set the position in gauge to 90, in the labels section set the placement to inside and distance from scale to 30.  Set the major tick mark placement to inside.  Phew!

Tidy up your fonts and general layout and you're good to go:


That's about it - if all that seems like a lot of work download the sample report and use that instead :)

HowTo2008Bullets.rdl (41.22 kb)