5/31/2018
Building a Calendar in Tableau with Discrete Events
This blog post is based on a recent visualization we created at the office. The goal was to visualize a list of automated tasks that occur periodically throughout a month. Some of these tasks happen daily, some weekly, bi-monthly and monthly. There are 14 total processes that trigger at different times during the month. We wanted a way to visualize this, in a calendar form, rather than just a list in Excel. Most calendar views in Tableau visualize some sort of Measure. For example, this tutorial by Kevin Taylor demonstrates how to create a calendar with a Measure and check out this video by Data Science Central. However, in my scenario, I do not have any measures. I simply want to visualize a list of discrete events on the calendar as text. I will outline two methods to do this.
This is the final viz with some dummy events.
The data is very simple; there are two columns. "Action" is a list of events and "Date" which is a date field. These events occur every month, so we decided to visualize a single month, January 2018, so there are 31 days in the month. We don't have any processes that trigger over the weekend, so I am just visualizing weekdays. Also, we have at least one event everyday. If this is not the case in your data, then simply add a "blank" event on the days where there is no event to visualize. Download the data here if you would like to follow along with the steps outlined below. You can also download the finished workbook here.
Building a Basic Calendar in Tableau
This is the easy part. Building a basic calendar is pretty straight forward using any date field.
Move Date to Columns
Right-Click the Date on Columns. Select More (from Date Part) and Select Weekdays
Move Date to Rows
Right-Click the Date on Rows. Select More (from Date Part) and Select Week Number
Move Action to Color
Select "Entire View" from the view dropdown on the menu bar
This is the basic calendar setup in Tableau. You'll notice that instead of a measure on Color, we have the discrete events. The next step is to make them into a list. In this data set the weekends are listed as an event and so we'll filter those out.
Move Action to Filters and uncheck Weekends to filter them out.
I am going to demonstrate two different methods for building this calendar, so right-click on the current worksheet and duplicate.
Adding Discrete Events Using Shapes
One way to list the discrete events is to use shapes. To do this we need to create a custom shape, stack the shapes and size them accordingly. Note - if using this method then sizing the shapes is very important. Otherwise you will have too much space between the shapes or they will overlap on top of each other.
Step 1: Create, Import and Assign a Custom Shape
I used PowerPoint to create a long pill shape and added it to my Tableau Shapes folder. The key to this is getting the size right, so you may need to experiment with the height and width depending on the size of your sheet or dashboard.
Create the desired shape in PowerPoint.
Right-click and Save Picture as a PNG file in one of your shapes folders (.../Documents/My Tableau Repository/Shapes folder/Misc)
or download the shape I created here.
Select Shape from the dropdown menu on the Marks Card
Click on Shape on the Marks Card and Select More Shapes
Click the "Reload Shapes" button to load your new shape into Tableau
Select the folder from the dropdown menu in the Shapes window.
Assign the new custom shape and click OK
Step 2: Creating an Index of the Events
We want to have a shape for each event and we want to stack them on top of each other. To do this, we will use the index() function..
Calculated Field Name: Index
Formula: index()
Calculated Field Name: Combined Date
Formula: DATEPART('weekday', [Date]) + DATEPART('week', [Date])
Move Combined Date from Measures to Dimensions
Move Combined Field to Details
Move Index to Rows
Right-click Index on Rows and Select Edit Table Calculations
Select "Specific Dimensions" and check the box for Combined Details and Action
Double-click the y-axis and set the axis range as needed. I set it from 0 to 6 in this example, which will allow room for the day of the month label.
Click Size and size the shapes as appropriate for the view
Move Action to Label
Click Label and set Alignment to Middle and Center and check the box to "Allow labels to overlap other marks"
Click Label and set Font Color to white
You should now a view that looks something like this:
Step 2: Add Day of the Month Labels in the Upper Right-Hand Corner
Double-click on the rows to enter an in-line formula and type avg(6)
Right-click on the new field and Select "Dual Axis"
Right-click on the secondary y-axis and Select "Synchronize Axis"
Select the first Marks card Index() and remove Measure Names from Color
Select the second Marks card AGG(avg(6)) and remove all of the pills on Color, Details and Label
Move Date to Label
Right-Click the Date on Label and Select Day (from Date Part)
Click Label and set Alignment to Top and Right
Click Color and set Opacity to 0%
Click Size and set the slider to size the blank shape so the day of the month is in the top right-hand corner
You should now have a view that looks something like this:
Step 3: Formatting View for Calendar
Right-click on Field Labels for Columns and Select Hide Field Labels for Columns
Right-click on Week(Date) and uncheck Show Header
Right-click on Y-Axis and uncheck Show Header
Right-click on calendar area and select Format
Select Lines and remove Grid Lines on Rows
Select Borders and Click the Sheets tab and drag the Column Divider Level slider to the right
Select Analysis from the top menu and select Table Layout and Advanced and uncheck the box "Show innermost level at the bottom of view when there is a vertical axis" and click Apply
Assign Colors to the Actions as desired (optional)
If you would prefer the events to start at the top of the calendar instead of the bottom:
Right-click Index on Rows and select "Show Header"
Double-click the y-axis and select "Reversed" under Scale
Set the axis scale to be fixed from -1 to 5
Right-click Index on Rows and uncheck "Show Header"
Double-click AGG(avg(6)) on the Rows and change the 6 to -1
Right-click Action on the Index Marks card and select Sort and change Sort Order to Ascending
Right click calendar area and select Format and select Lines and remove Zero Lines on Rows
Here is the final view using shapes:
Adding Discrete Events Using A Stacked Bar Chart
Another way to show the discrete events is to use a stacked bar chart. I prefer this method over the shapes because the sizing of the the shapes can be problematic based on the worksheet and dashboard sizing and custom shapes do not export in high resolution. We start with the same approach as the shapes, so use the worksheet that you duplicated after creating the basic calendar template.
Step 1: Creating a Stacked Bar Chart
We want to have a bar segment for each event and we want to stack them on top of each other. To do this, we will use the countd() function.
Calculated Field Name: Count Distinct
Formula: COUNTD([Action])
Move Count Distinct to Rows
On the Marks card, change the dropdown from Automatic is Bars
Click Color and set Borders to white (or to match the background color)
Move Action to Label
Click Label and set Alignment to Middle and Center and check the box to "Allow labels to overlap other marks"
Click Label and set Font Color to white
Double-click on the rows to enter an in-line formula and type avg(5)
Right-click on the new field and Select "Dual Axis"
Right-click on the secondary y-axis and Select "Synchronize Axis"
Select the first Marks card AGG(Count Distinct) and remove Measure Names from Color
Select the second Marks card AGG(avg(5)) and remove all of the pills on Color, Details
Move Date to Text
Right-Click the Date on Label and Select Day (from Date Part)
Click Color and set Opacity to 0% and Borders to None
Click Label and set Alignment to Top and Right
You should now a view that looks something like this:
Step 2: Formatting View for Calendar
Right-click on Field Labels for Columns and Select Hide Field Labels for Columns
Right-click on Week(Date) and uncheck Show Header
Right-click on Y-Axis and uncheck Show Header
Right-click on calendar area and select Format
Select Lines and remove Grid Lines on Rows
Select Borders and Click the Sheets tab and drag the Column Divider Level slider to the right
Select Analysis from the top menu and select Table Layout and Advanced and uncheck the box "Show innermost level at the bottom of view when there is a vertical axis" and click Apply
Assign Colors to the Actions as desired (optional)
As with the shapes, if you would prefer the events to start at the top of the calendar instead of the bottom:
Right-click AGG(Count Distinct) on Rows and select "Show Header"
Double-click the y-axis and select "Reversed" under Scale
Set the axis scale to be fixed from -1 to 4
Right-click Index on Rows and uncheck "Show Header"
Double-click AGG(avg(6)) on the Rows and change the 6 to -1
Right-click Action on the AGG(Count Distinct) Marks card and select Sort and change Sort Order to Descending
Right-click on the calendar area and select Format and select Lines and remove Zero Lines on Rows
The final version of the Automated Process Calendar:
I hope you find this information useful. If you have any questions feel free to email me at Jeff@DataPlusScience.com