In this post, I will critique on one original visualisation designed to reveal the inter- and intra-zonal public bus flows at the planning sub-zone level of January 2022 and propose an alternative for improvement using Tableau.
The dataset used for the original interactive visualisation is downloaded from from Land Transport Authority (LTA) Datamall and URA region, planning area and planning subzone information were added by using GIS Overlay operation.

Lack of proper title for visualization: Firstly, for the entire dashboard, there is no title provided to give a short summary of the context or background of the data. It would then be difficult for the viewers to figure out what exactly are the charts inside the dashboard analyzing. Secondly, for the individual plots, the title provided did not convey a clear message. Specifically, looking at the title of the bar chart, the readers may misinterpret it as the number of trips generated from origin sub-zone at different time of the day. In fact, the graph actually plots the total amount of passengers who took a bus trip generated from/attracted to a sub-zone along the day, hence it refers to the transit ridership of bus trips. Similarly, the readers would not be able to understand what the graph is about when they read upon a title named ‘adjacency matrix’.
No geographical illustration provided: The data set given contains aspatial data with geographical implications, such as sub-zones,planning areas and regions of the bus trips. Despite having the bar chart and adjacency matrix to show the changes in volume of ridership, the readers are still unable to visualize the geographical distance between a pair of origin and destination sub-zones as these graphs cannot reveal the spatial relationship between different sub-zones.
Misleading tooltip information: When you hover over the bar chart, the tooltip information indicates that the height of the bar represents the ‘total trip’. This is misleading as the reader may interpret it as the number of bus trips generated from/ attracted to a sub-zone per hour. In fact, it should be the total amount of passengers who took a bus trip generated from the origin sub-zone or attracted to the destination sub-zone. Similarly, when you hover over the adjacency matrix, the tooltip information shows ‘% of Total Total Trips along Table (Across)’, which is also confusing for the readers as to what it actually means.
Existence of null values in the data set: As seen from the ‘Origin Sz’ and ‘Destination Sz’ filters located at the right side, both columns contained null values. This may cause confusion for the readers and hence data preparation need to be done for these records containing null values before plotting the visualization.
Lack of indication for source of information: There is not caption indicating source of data.
Poor arrangement of the graphs inside dashboard: The graphs inside the dashboard are poorly arranged. This could be seen from the difference in size of weekday and weekend adjacency matrix located at the right side of the dashboard. Also, the bar charts for bus trips from origin sub-zone and bus trips to destination sub-zone are misaligned as the top and bottom line for the weekday plots are not even on the same level. As a result, the dashboard looks less organised and messy for the readers.
Extremely small size of adjacency matrix plot: Despite having a stepped color scale to show the difference in popularity for various pairs of origin sub-zone and destination sub-zone in terms of transit ridership, the readers are not be able to visualize the distinction in color intensity easily. This is because each colored cell is extremely small when there is a large number of sub-zones plotted in both axes for the graph. Even when the reader hover over a particular cell inside the matrix, he or she cannot really see the color of the cell.
Choice of color for the graphs: A single color is used for both bar charts representing outbound and inbound bus trips of a particular sub-zone, making it hard for readers to distinguish the difference directly. Also, the color scale chosen for the adjacency matrix (gray gradient) is not consistent with the color used for the bar chart (blue gradient). This would be visually distracting for the readers as the color reference is not consistent.
Repeated Y-Axis Header: Repeated y-axis headers (e.g. weekdays and weekends) are observed in the bar charts. Also, the Y-axis header is not displayed in full and it should be ‘weekends/ holidays’ instead of just ‘weekends’.
Lack of filters provided: In the original visualization, the reader only has a limited choice of selecting the origin and destination sub-zone. This limited interactivity minimizes the chances for the reader to decide and explore the data set on their own.
Limited tooltip information: Currently, the tooltip only provides limited information and there are other information in the data set that could be used to provide additional details for the reader.
No synchronization between the bar chart and adjacency matrix: The filters in the dashboard only apply for the bar charts but not the adjacency matrix as there is no synchronization between the different types of graph. Hence, after selecting the origin or destination sub-zone, the bar chart (e.g. title and height of the bar) will change accordingly, but there is no change in the adjacency matrix to highlight reader’s filtered results.
Modify and graph titles and add in a dashboard title: Add in a main title for the dashboard to summarise that it is about the Singapore’s inter- and intra-zonal public bus flows of January 2022. For the individual graphs, a more specific title would be used for readers to better understand what the graph is about.
Provide a choropleth map for better reference: Add in a choropleth map with sub-zones shaded in proportion to the aggregate transit ridership. The map would allow the readers to view the geographical distribution of the bus trips across various sub-zones. Specifically, the readers could visualize locations of the origin and destination of bus trips by sub-zones as well as the corresponding geographical span. This enable the readers to better explore the relationship between transit ridership and route of the bus trips.
Tooltip information: To edit the tooptip information, I would rename the ‘total trips’ column of the data set to ‘total transit ridership’ to indicate that it is the in fact the the total amount of passengers who took a bus trip generated from the origin sub-zone or attracted to the destination sub-zone.
Proper data preparation to handle null values: Use Tableau Prep Builder to clean up the data before plotting. Specific procedures could be found in Section 6 Step-by-step Guide Using Tableau.
Add in a caption: Caption is added to include source data link at the bottom of the visualization.
Well-organised and aligned graphs inside the dashboard: The graphs inside the dashboard would be properly organised so that the size of the same type of graphs would be the same. Also, the graphs would be aligned
size of adjacency matrix plot
Improved use of color to provide better distinction: Distinct colors will be used to differentiate inbound and outbound bus trips so that it would be visually friendly for the readers to make direct comparison. Also, the same set of color schemes should be used for different charts inside the dashboard to ensure consistency throughout.
Remove the repetitive y-axis headers and rotate it to be vertically placed.
Add in more filters: Other filters such as day types (weekday or weekends) could be provided for the readers sto elect the portion of data of their interest and make comparison between and drive insightful observation.
Provide more information for tooltip: Update the tooltip to include the corresponding planning area and region of the sub-zones as supplementary details.
Apply synchronization across charts inside dashboard: The charts inside the dashboard would be synchronized accordingly so that once the readers select a variable, the filtering effect would be applied across all he charts inside the dashboard.
Here is the proposed alternative drawn by hand. 
Please view the detailed proposed alternative on Tableau Public here.
| No | Step | Action |
|---|---|---|
| 1 | Import the data by dragging the csv file into the center of Tableau Prep Builder. Right click the file icon and choose ‘Clean Step’. | ![]() |
| 2 | Find the ‘ORIGIN_SZ’ column, click on ‘Filter’ and then ‘Null Values’ to keep only on the null values. | ![]() |
| 3 | Find the ‘ORIGIN_PT_CODE’ column, choose ‘Detail’ under the ‘View State’. This would allow us to see the list of the origin_pt_codes of the bus stops which have a missing sub-zone name in the data set. | ![]() |
| 4 | UseURA website to find the corresponding sub-zones for the origin_pt_code. Key in the 5 digit code and click the ‘See other Services’ button under the Land Information’ Tab to find the correspondent sub-zone under ‘Planning Boundary’. | ![]() |
| 5 | Repeat steps 4 for all the origin_pt_codes of the bus stops without a correspondent sub-zone name. Go back to the ‘ORIGIN_SZ’ column and click on ‘Custom Calculation’ under ‘Create a Calculated Field’. | ![]() |
| 6 | Key in the following code to fill in the corresponding sub-zone names according to the orgin pt_codes. | ![]() |
| 7 | Click on the ‘cross’ icon at the top right corner of the ‘filter’ card under ‘Changes’ to remove the ‘keep only null values’ effect. | ![]() |
| 8 | Repeat steps 2-7 to fill in the values for the destination pt_codes without corresponding sub-zone names. Export the file in csv format by clicking on ‘output’ besides the ‘+’ sign. | ![]() |
| 9 | Import the data by dragging the csv file and the shapefile into the data source page. Create a relational join for the two files by choose the ‘relationships’ option along the drop-down list. Then, set the ‘Destination Sz’ and ‘Origin Sz’ variable from the data set to be equal to the ‘Subzone N’ variable from the shapefile. | ![]() |
| 10 | Rename the ‘Total trip’ column into ‘Transit Ridership’ by clicking on the field name. | ![]() |
| 11 | Firstly, we would be plotting the bar chart to indicate the transit ridership of different bus trips. Convert ‘Time per day’ to dimension by right clicking and choosing ‘Convert to dimension’. | ![]() |
| 12 | Drag ‘Time per hour’ into Columns shelves, ‘Day type’ and ‘Transit Ridership’ to Rows shelves. Then, drag ‘Day type’ and ‘Origin Sz’ over to the ‘Filters’ card above ‘Marks’. | ![]() |
| 13 | Change the type of filter from radio button to drop-down list by clicking ‘Single Value (drop down)’. | ![]() |
| 14 | Edit the title of the bar chart accordingly. | ![]() |
| 15 | Hide the y-axis header by unticking the ‘show header’ and choose ‘rotate the labels’ to exhibit the y-axis labels in full. | ![]() |
| 16 | Repeat steps 12-15 to create the second bar chart for trips attracted to destination sub-zone. Note that you need to drag ‘Destination Sz’ over to the ‘Filters’ card above ‘Marks’ instead of ‘Origin Sz’. Use ‘orange’ color to distinguish inbound and outbound trips. | ![]() |
| 17 | Secondly, we would be creating the choropleth map. Drag ‘Geometry’ and ‘Subzone N’ over to the ‘Detail’ icon under the ‘Marks’ card. Then, drag ‘Transit Ridership’ over to the ‘Color’ icon. Next, drag ‘Origin Sz’ and ‘Day Type’ over to the ‘Filters’ card. | ![]() |
| 18 | Right click the ‘Transit Ridership’ under the ‘Marks’ card and convert it from absolute number to a representation of the percentage by choosing ‘Percent of Total’ under ‘Quick Table Calculation’. | ![]() |
| 19 | Similar to step 13, change the type of filter from radio button to drop-down list by clicking ‘Single Value (drop down)’. | ![]() |
| 20 | Change the color scheme of the map to ‘blue’ to be in consistency with choice of color for bar chart of inbound trips. | ![]() |
| 21 | Edit the title of the map accordingly. | ![]() |
| 22 | Repeat steps 17-21 to create second map for trips attracted to destination sub-zone. Note that you need to drag ‘Destination Sz’ over to the ‘Filters’ card above ‘Marks’ instead of ‘Origin Sz’. Use ‘orange’ color to distinguish inbound and outbound trips. | ![]() |
| 23 | Arrange the bar charts and choropleth map inside a dashboard. Synchronise the charts by editting the filters to apply to selected worksheets and link the map and barcharts according to trip types (inbound or outbound). Add in dashboard title accordingly | ![]() |


