Level Up Your Databricks Dashboard

Transform a basic NYC taxi dashboard into a polished two-page analytics dashboard.

Introduction

30 Second Summary

Data only tells a story when it is presented well. A dashboard crammed onto one scrolling page with default colors and no way for viewers to interact is a draft, not a deliverable.

In this project, you will transform your NYC taxi dashboard into a polished, two-page Databricks analytics dashboard with KPI counters, trend lines, heatmaps, interactive filters, and a professional visual theme.

What You'll Build

Share the finished dashboard and your viewer lands on the Summary page, which answers "when do people ride?" with headline KPI counters and demand patterns. One click switches to the Deep Dive page, where scatter plots and heatmaps answer "what makes trips profitable?" with interactive, cross-filtered charts.

By the end of this project, you'll have:

  • KPI counters with sparklines that display total trips, average fare, and average distance at a glance, plus a weekly trend line chart showing fare patterns over time.
  • A heatmap that reveals NYC taxi demand spikes by hour and day of week, and a scatter plot that exposes the strong linear relationship between trip distance and metered fare.
  • Cross-filtering and filter widgets that let viewers click a chart element or select a zip code to instantly update every other visualization on the page.
  • Secret Mission: Build a custom Vega-Lite gauge visualization that shows average fare against a target with color-coded fill.

Are there any prerequisites?

This project builds on the dashboard you created in Build Your First Databricks Dashboard. You should be comfortable writing basic SQL queries.

Before We Start

Before diving into charts and filters, let's lock in what you're about to build and why it matters.

Create a New Dashboard and Set Up Multi-Page Layout

Your first Databricks dashboard works, but it crams every chart onto one scrolling page. That makes it impossible to screenshot cleanly or present to stakeholders.

Professional analysts solve this by splitting dashboards into focused pages, each fitting on a single screen. In this step, you'll create a new dashboard, set up a two-page layout, and add the SQL datasets that power every visualization in this project.

In this step, get ready to:
  • Create a new AI/BI dashboard in your Databricks workspace.
  • Add two SQL datasets that query and transform the NYC taxi data.
  • Set up a two-page layout with a "Summary" page and a "Deep Dive" page.
Create a new dashboard

Instead of editing your existing dashboard, you'll start fresh. A new dashboard gives you a clean canvas to build a polished, multi-page layout from scratch.

  • In the Databricks sidebar, click Dashboards.
  • Click Create dashboard.

An empty canvas opens with one page tab labeled "Untitled page" at the top.

Add the base trips dataset

Every visualization needs data behind it. Your first dataset pulls individual NYC taxi trips and adds two derived columns: the day of the week and the pickup hour. These columns power the heatmap and scatter plot you'll build later.

  • Click the Data tab.
  • Click Add SQL dataset.
  • Name the dataset trips_base.
  • Paste the following SQL query into the query editor:
SELECT
  tpep_pickup_datetime,
  tpep_dropoff_datetime,
  fare_amount,
  pickup_zip,
  dropoff_zip,
  trip_distance,
  CASE
    WHEN dayofweek(tpep_pickup_datetime) = 1 THEN 'Sunday'
    WHEN dayofweek(tpep_pickup_datetime) = 2 THEN 'Monday'
    WHEN dayofweek(tpep_pickup_datetime) = 3 THEN 'Tuesday'
    WHEN dayofweek(tpep_pickup_datetime) = 4 THEN 'Wednesday'
    WHEN dayofweek(tpep_pickup_datetime) = 5 THEN 'Thursday'
    WHEN dayofweek(tpep_pickup_datetime) = 6 THEN 'Friday'
    WHEN dayofweek(tpep_pickup_datetime) = 7 THEN 'Saturday'
    ELSE 'N/A'
  END AS day_of_week,
  hour(tpep_pickup_datetime) AS pickup_hour
FROM samples.nyctaxi.trips
WHERE trip_distance > 0
  AND trip_distance < 10
  AND fare_amount > 0
  AND fare_amount < 50

What does this query do?

  • It pulls raw trip data (timestamps, fare, distance, zip codes) from the samples.nyctaxi.trips table.
  • The CASE statement converts the dayofweek() number (1 = Sunday, 2 = Monday, etc.) into a readable day name stored as day_of_week.
  • hour(tpep_pickup_datetime) extracts the pickup hour (0-23) so you can analyze trips by time of day.
  • The WHERE clause filters out invalid trips (zero distance, negative fares) and extreme outliers (over 10 miles or over $50).
  • Click Run to execute the query.

You should see a results table appear below the query editor. The columns include day_of_week (showing day names like "Monday") and pickup_hour (showing numbers like 8 or 17).

Not seeing any results?

  • Check that the dataset name is trips_base and the SQL is pasted into the query editor, not the name field.
  • Make sure the table name is exactly samples.nyctaxi.trips. This is a built-in sample dataset that comes with every Databricks workspace.
  • If you see a syntax error, check that each WHEN line has both THEN and a quoted day name. Missing quotes are a common culprit.
  • Why isn't my trips_base query returning results in Databricks?
Add the weekly trends dataset

Your second dataset aggregates trips by week instead of listing individual rows. This gives you the data behind the weekly trend line chart you'll build on the Summary page.

  • Click Add SQL dataset again.
  • Name the dataset weekly_trends.
  • Paste the following SQL query into the query editor:
SELECT
  date_trunc('week', tpep_pickup_datetime) AS week,
  COUNT(*) AS trip_count,
  ROUND(AVG(fare_amount), 2) AS avg_fare,
  ROUND(AVG(trip_distance), 2) AS avg_distance
FROM samples.nyctaxi.trips
WHERE trip_distance > 0
  AND trip_distance < 10
  AND fare_amount > 0
  AND fare_amount < 50
GROUP BY 1
ORDER BY 1

What does this query do?

  • date_trunc('week', ...) rounds each trip's timestamp down to the start of its week, grouping all trips in the same week together.
  • COUNT(*) counts total trips per week. ROUND(AVG(...), 2) calculates the average fare and distance, rounded to two decimal places.
  • ORDER BY 1 sorts the results chronologically so the trend line displays in time order.
  • Click Run to execute the query.

You should see a results table with columns: week, trip_count, avg_fare, and avg_distance. Each row represents one week of aggregated trip data.

Seeing a syntax error?

  • Check that date_trunc uses single quotes around 'week', not double quotes.
  • Make sure GROUP BY 1 and ORDER BY 1 are on separate lines after the WHERE clause.
  • Why is my weekly_trends query failing in Databricks?

✔️ Awesome, I've got everything!

Both datasets are returning results. You're all set to move on.

ⓧ I'd like to double check the full code

Here is the full SQL for trips_base:

SELECT
  tpep_pickup_datetime,
  tpep_dropoff_datetime,
  fare_amount,
  pickup_zip,
  dropoff_zip,
  trip_distance,
  CASE
    WHEN dayofweek(tpep_pickup_datetime) = 1 THEN 'Sunday'
    WHEN dayofweek(tpep_pickup_datetime) = 2 THEN 'Monday'
    WHEN dayofweek(tpep_pickup_datetime) = 3 THEN 'Tuesday'
    WHEN dayofweek(tpep_pickup_datetime) = 4 THEN 'Wednesday'
    WHEN dayofweek(tpep_pickup_datetime) = 5 THEN 'Thursday'
    WHEN dayofweek(tpep_pickup_datetime) = 6 THEN 'Friday'
    WHEN dayofweek(tpep_pickup_datetime) = 7 THEN 'Saturday'
    ELSE 'N/A'
  END AS day_of_week,
  hour(tpep_pickup_datetime) AS pickup_hour
FROM samples.nyctaxi.trips
WHERE trip_distance > 0
  AND trip_distance < 10
  AND fare_amount > 0
  AND fare_amount < 50

Here is the full SQL for weekly_trends:

SELECT
  date_trunc('week', tpep_pickup_datetime) AS week,
  COUNT(*) AS trip_count,
  ROUND(AVG(fare_amount), 2) AS avg_fare,
  ROUND(AVG(trip_distance), 2) AS avg_distance
FROM samples.nyctaxi.trips
WHERE trip_distance > 0
  AND trip_distance < 10
  AND fare_amount > 0
  AND fare_amount < 50
GROUP BY 1
ORDER BY 1
Set up two dashboard pages

Right now the dashboard has a single "Untitled page." You'll split it into two focused pages: one for high-level KPI summaries and one for deeper analysis charts.

  • Click the Canvas tab to return to the dashboard canvas.
  • Double-click the page title Untitled page at the top of the canvas.
  • Rename it to Summary.
  • Click the plus icon to the right of the page tab to add a new page.
  • Double-click the new page title and rename it to Deep Dive.
  • Click back on the Summary tab.

Before you move on, take a moment. What should you see right now if everything worked correctly?

You should see two page tabs at the top of the canvas: Summary and Deep Dive. Both pages are empty canvases waiting for visualizations. If you click the Data tab, you'll see your two datasets (trips_base and weekly_trends) both returning results.

Only seeing one page tab?

  • Look for the plus icon immediately to the right of the existing page tab. It's small and easy to miss.
  • Make sure you are on the Canvas tab, not the Data tab. Page tabs only appear on the canvas view.
  • I can't find the plus icon to add a new page to my Databricks dashboard.

Your dashboard skeleton is ready with two focused pages and the data to power them. Next up, you'll fill the Summary page with KPI counters and a trend line chart that give stakeholders the headline numbers at a glance.

Build the Summary Page

Your dashboard has two focused pages and two datasets loaded with NYC taxi trip data. The canvas is ready for its first visualizations.

When a dashboard opens with charts but no headline numbers, viewers have to scan and calculate to understand the big picture. Counter widgets solve this by putting key metrics front and center, and a trend line provides the "so what" context.

In this step, get ready to:
  • Add three counter widgets with sparklines showing total trips, average fare, and average distance.
  • Build a weekly fare trend line chart to reveal fare patterns over time.
Create the total trips counter

A counter widget displays a single metric prominently so viewers can read the headline number instantly. You will start with one that shows the total number of taxi trips.

  • On the Summary page, click Add a visualization.
  • Place the widget at the top-left of the canvas.
  • In the Visualization Configuration panel on the right, select Counter from the Visualization dropdown.
  • Select the trips_base dataset from the Dataset dropdown.
  • For Value, select fare_amount.
  • Set the Transform to Count.

The counter now displays a number representing the total count of taxi trips in your dataset.

  • In the sparkline section, select tpep_pickup_datetime as the date column.
  • Enable Format template in the Value configuration details.
  • Enter {{ }} trips in the template field.

Your counter now shows the total trip count with a "trips" suffix and a small sparkline showing the distribution over time.

What is a sparkline?

A sparkline is a tiny line chart embedded inside the counter widget. It shows the trend of that metric over time without taking up a full chart's worth of space.

By selecting a date column like tpep_pickup_datetime, the counter automatically aggregates the metric by date and draws the trend in the background.

Add the average fare and average distance counters
  • Click Add a visualization.
  • Place the widget to the right of your first counter.
  • Select Counter from the Visualization dropdown.
  • Select the trips_base dataset.
  • For Value, select fare_amount.
  • Set the Transform to Average.
  • Select tpep_pickup_datetime as the sparkline date column.
  • Enable Format template and enter ${{ }} in the template field.

This counter shows the average fare amount with a dollar sign prefix and a sparkline trend.

  • Click Add a visualization.
  • Place the widget to the right of the second counter.
  • Select Counter from the Visualization dropdown.
  • Select the trips_base dataset.
  • For Value, select trip_distance.
  • Set the Transform to Average.
  • Select tpep_pickup_datetime as the sparkline date column.
  • Enable Format template and enter {{ }} mi in the template field.

You now have three counters spanning the top of your Summary page. Each shows a different headline metric with a sparkline trend beneath it.

Not seeing the sparkline?

  • Make sure you selected tpep_pickup_datetime as the date column in the sparkline section of each counter. Without a date column, the sparkline will not appear.
  • If the counter shows a raw number without your prefix or suffix, check that Format template is toggled on and the template text matches exactly (e.g. {{ }} trips).
  • If the counter shows zero or an unexpected value, verify you selected the correct field and transform (e.g. fare_amount with Count for total trips, Average for the other two).

Still stuck? Why isn't my counter sparkline showing up?

Add a weekly fare trend line chart

The counters give the instant headline. A trend line below them answers the follow-up question: how are fares changing over time?

  • Click Add a visualization.
  • Place the widget below the three counters, spanning the full width of the canvas.
  • Select Line from the Visualization dropdown.
  • Select the weekly_trends dataset from the Dataset dropdown.
  • Set the X axis to week.
  • Set the Y axis to avg_fare.

A line chart appears showing the average fare plotted against each week.

  • Click the kebab menu (three dots) in the X Axis section and set the axis title to Week.
  • Click the kebab menu in the Y Axis section and set the axis title to Average Fare ($).
  • Toggle Data labels on.
  • Set the data label formatting to 2 decimal places.
  • Toggle Gridlines off.

Why turn gridlines off?

Gridlines can add visual noise when your data labels already show exact values on each data point. Removing them creates a cleaner, more focused chart that draws attention to the trend line itself.

The line chart now has clear axis titles, shows exact values on each data point, and has a clean look without gridlines.

Chart looks empty or shows unexpected data?

  • Verify you selected the weekly_trends dataset, not trips_base. The line chart uses the aggregated weekly data.
  • If the X axis shows dates in a strange format, make sure the week field is selected for the X axis.
  • If you do not see data labels, confirm the Data labels toggle is on and the formatting is set to 2 decimal places.

Still stuck? Why is my line chart empty or showing the wrong data?

Before you move on, take a step back and look at your Summary page. What are the three things a stakeholder would learn within five seconds of opening this dashboard?

Your Summary page should show three counters at the top: the total trip count with a "trips" suffix, the average fare with a dollar sign, and the average distance with a "mi" suffix. Each counter has a sparkline showing the trend over time. Below the counters, a line chart reveals the weekly average fare pattern.

✔️ My Summary page looks great

Excellent. Your Summary page is delivering headline numbers at a glance, exactly what a professional dashboard should do.

ⓧ Something looks off

  • Check that all three counters use the trips_base dataset with the correct fields: fare_amount (Count) for total trips, fare_amount (Average) for average fare, and trip_distance (Average) for average distance.
  • Confirm the line chart uses weekly_trends with week on the X axis and avg_fare on the Y axis.
  • Verify each counter has tpep_pickup_datetime selected as the sparkline date column.
  • Verify the format templates match exactly: {{ }} trips, ${{ }}, and {{ }} mi.

Your Summary page now gives viewers the headline numbers at a glance. Next up, you will build the Deep Dive page with a heatmap and scatter plot that reveal patterns hidden in the raw data.

Build the Deep Dive Page with a Heatmap and Scatter Plot

Your Summary page gives stakeholders the headline numbers at a glance. Now it's time to fill the Deep Dive page with charts that let viewers explore the data more closely.

Bar charts work well for simple comparisons, but they fall apart when you need to show patterns across two dimensions at once. A heatmap reveals these patterns instantly through color intensity. In this step, you'll build a heatmap and a scatter plot that show NYC taxi patterns from angles your Summary page can't.

In this step, get ready to:
  • Add a heatmap that shows trip volume by hour and day of week.
  • Add a scatter plot that reveals the relationship between trip distance and fare.
Add a heatmap showing trip volume by hour and day of week

A heatmap uses color intensity to show the density of data across two axes. You'll use it to plot trip volume by hour and day of week, making it easy to spot when NYC taxis are busiest.

  • Click the Deep Dive page tab at the top of the canvas.
  • Click Add a visualization and place the widget in the top half of the canvas.
  • In the Visualization Configuration panel, select Heatmap from the Visualization dropdown.
  • Select the trips_base dataset.
  • Set the X axis to pickup_hour.
  • Set the Y axis to day_of_week.

The heatmap renders on the canvas. The color encoding defaults to a count aggregation, so darker cells represent more trips at that hour and day combination.

What does the heatmap show?

Each cell in the heatmap represents one combination of pickup hour (X axis) and day of the week (Y axis). The color intensity tells you how many trips happened during that specific time slot.

This is something a bar chart can't do. A bar chart could show trips by hour or trips by day, but not both dimensions on one chart. The heatmap shows you exactly which hours on which days are busiest.

Now look at the Y axis. The days are sorted alphabetically: Friday, Monday, Saturday, and so on. This makes it impossible to compare weekday patterns against weekend patterns, because the days aren't in calendar order.

Why does alphabetical order matter?

The most interesting pattern in taxi data is how weekday behavior differs from weekends. With days scattered alphabetically, Saturday sits between Monday and Sunday, and you can't visually compare the five weekdays against the two weekend days. You'll fix this sort order in the next step.

Add a scatter plot showing fare vs. distance

The scatter plot will show each trip as a dot, plotting distance against fare. Color-coding by day of the week adds a third dimension so viewers can spot whether weekday and weekend trips behave differently.

  • Click Add a visualization and place it in the bottom half of the canvas, below the heatmap.
  • Select Scatter from the Visualization dropdown.
  • Select the trips_base dataset.
  • Set the X axis to trip_distance.
  • Set the Y axis to fare_amount.
  • Click the plus icon next to Color and select day_of_week to color-code each point by day.
  • Set the legend position to Bottom using the kebab menu (three dots) in the Color section.

The scatter plot appears below the heatmap. You should see a dense diagonal line spreading upward and to the right, confirming that metered fares increase linearly with distance. Each day of the week has its own color in the legend at the bottom.

What does the scatter plot reveal?

NYC taxi fares are metered, so distance and fare have a strong linear correlation for standard trips. The dense diagonal line you see is that metered-rate relationship in action.

Your WHERE filter keeps trips under 10 miles and $50, which intentionally excludes JFK Airport flat-rate fares (around $52–70). Without that filter, you would see a horizontal band of dots at those price points, looking like noise unless you know it represents airport trips.

🙋‍♀️ Not seeing colored dots?

Make sure you selected day_of_week in the Color section, not in the X or Y axis fields. The color field is a separate section in the configuration panel.

If the chart appears blank, double check that you selected the trips_base dataset (not weekly_trends). The weekly trends dataset doesn't have a trip_distance column.

Help me fix my scatter plot on the Deep Dive page.

Check the full Deep Dive page

Take a step back and look at both charts together. Do you think the heatmap clearly reveals when NYC taxis are busiest during the week?

The scatter plot tells a clear story. Fares increase with distance, and the color coding lets you compare across days. The heatmap, however, has a problem. The days are sorted alphabetically (Friday, Monday, Saturday...), which scrambles the calendar order and makes the weekday-vs-weekend pattern impossible to read.

This is intentional

Databricks sorts text values alphabetically by default. In the next step, you'll use the Custom sort option to drag the days into calendar order. Once you do, the weekday rush-hour vs. weekend leisure pattern will pop right out of the heatmap.

✔️ Awesome, I've got everything!

Great. Confirm your Deep Dive page has a heatmap in the top half and a scatter plot in the bottom half, both using the trips_base dataset.

ⓧ Let me double check my setup

Here's what each chart should have configured:

  • Heatmap: Dataset: trips_base. X axis: pickup_hour. Y axis: day_of_week (sorted alphabetically for now). Color encoding: count aggregation.
  • Scatter plot: Dataset: trips_base. X axis: trip_distance. Y axis: fare_amount. Color: day_of_week. Legend position: Bottom.

Your Deep Dive page has two powerful charts, but the heatmap isn't telling its full story yet. Next up, you'll fix the day-of-week sort order and add interactivity so viewers can explore the data themselves.

Fix the Heatmap and Add Interactivity

Your Deep Dive page now has two powerful visualizations. But there is a problem hiding in plain sight. The heatmap's Y axis sorts the days alphabetically (Friday, Monday, Saturday...) instead of in calendar order, making it impossible to spot weekday-vs-weekend patterns.

In this step, you will fix the sort order to reveal those patterns instantly. You will also add filter widgets and cross-filtering so viewers can drill into specific zip codes and time slots on their own.

In this step, get ready to:
  • Fix the heatmap's day-of-week sort order to reveal the weekday-vs-weekend pattern.
  • Add pickup and dropoff zip code filter widgets.
  • Test cross-filtering between the heatmap and scatter plot.
Fix the heatmap day-of-week sort order

Alphabetical order puts Friday first and Wednesday last. That hides the most interesting story in the data: weekday commute rushes versus slower weekend traffic. A custom sort lets you define the exact order you want.

  • Click on the heatmap on your Deep Dive page to select it.
  • In the Visualization Configuration panel, click the kebab menu (three dots) next to the Y axis field (day_of_week).
  • Under Sort, select Custom.

A list of day names appears. Each value has a grab-handle you can use to drag it into position.

  • Hover over each value and use the grab-handle to drag them into calendar order: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday.

The heatmap updates immediately. With days in calendar order, the real NYC taxi demand pattern jumps out: weekday rush hours (7–9 AM and 5–7 PM) glow as the darkest cells, Thursday and Friday late nights show a second surge, and weekends spread demand more evenly across midday and afternoon hours.

Why does sort order matter so much here?

A heatmap communicates through spatial position and color intensity together. When the Y axis follows calendar order, adjacent rows represent adjacent days. Your eye can instantly compare the five weekday rows (with their sharp morning and evening peaks) against the two weekend rows (with their flatter, midday-heavy pattern).

Alphabetical order scatters related days across the chart. Friday sits next to Monday, and Saturday lands between them by accident. The commute-rush versus leisure-ride story disappears even though the underlying data is identical.

🙋‍♀️ Days not moving when you drag?

Make sure you selected Custom under Sort first. The grab-handles only appear after switching to Custom sort mode.

Also check that you clicked the kebab menu next to the Y axis field, not the X axis.

Help me fix the sort order on my heatmap Y axis.

Add filter widgets for zip codes

The heatmap and scatter plot show the full dataset right now. Filter widgets let viewers narrow down to specific pickup or dropoff neighborhoods without editing any SQL.

  • Click Add a filter on the canvas.
  • Click Widget title and type Pickup Zip Code.
  • From the Filter dropdown in the configuration panel, select Single value.
  • From the Fields menu, select pickup_zip.

You should see a filter widget appear on the canvas with the title Pickup Zip Code. Now you will clone it to create the dropoff filter.

  • Right-click on the filter widget.
  • Click Clone.
  • Double-click the title of the cloned filter and rename it to Dropoff Zip Code.
  • Remove the current field, then select dropoff_zip as the new field.
  • Drag both filter widgets to the top of the Deep Dive page, above the heatmap.

You should now see two filter widgets side by side at the top of the page.

Keep filters at the top

Positioning global filters (like zip code and date range) at the very top of a dashboard page creates a clear control bar. Viewers scan top-down, so they see the filter options first and understand they can narrow the data before reading any chart. Scattering filters beside or below charts makes them easy to miss.

💡 Why clone instead of creating a new filter?

Cloning copies the filter type and layout settings from the original, so you only need to swap the field and title. It saves you from re-selecting the filter type and re-sizing the widget.

🙋‍♀️ Don't see the Clone option?

Make sure you are right-clicking directly on the filter widget itself. If you right-click on the canvas background, you will see a different menu.

Help me clone a filter widget in Databricks.

Test cross-filtering and filters

Cross-filtering means clicking a data point in one chart automatically filters other charts on the same page. It works by default on built-in chart types that share the same dataset.

Before you click anything, think about this: what do you expect to happen to the scatter plot when you click a single cell on the heatmap?

  • Click on a cell in the heatmap. For example, click the cell for Wednesday at hour 8.

The scatter plot updates to show only trips from that specific time slot. Every other data point disappears. That is cross-filtering in action.

  • Select a value from the Pickup Zip Code filter.

Both the heatmap and scatter plot update to show only trips from that pickup zip code.

  • Click the heatmap cell again to deselect it and restore the full view.
  • Clear the zip code filter to reset both charts.

How does cross-filtering work?

When two charts share the same dataset (in this case, both use trips_base), clicking a data point in one chart tells Databricks to filter the shared dataset. Every other chart on the same page that uses that dataset updates automatically.

Filter widgets work similarly but let the viewer type or select a specific value instead of clicking a chart element.

🙋‍♀️ Scatter plot not filtering when you click the heatmap?

Check that both the heatmap and scatter plot use the same dataset (trips_base). Cross-filtering only works between charts that share a dataset.

Also make sure you are clicking directly on a colored cell in the heatmap, not on an empty area of the chart.

Help me get cross-filtering working between my charts.

Your Deep Dive page is now fully interactive. Viewers can spot patterns in the heatmap, click to drill down, and filter by zip code. Next up, you will polish both pages with a cohesive theme, formatted axes, and descriptive text to make your dashboard presentation-ready.

Polish with Theming and Formatting

Your dashboard has the right data, the right interactivity, and charts that tell a real story. But it still looks like a draft. Default colors, generic fonts, and raw column names on axes make every dashboard blend together.

Professional dashboards use consistent styling and descriptive labels so a stakeholder can read them without asking you to explain anything. In this step, you'll apply a cohesive theme across both pages and format every chart so it looks presentation-ready.

In this step, get ready to:
  • Apply a custom dashboard theme with colors and fonts.
  • Format chart axes with clear titles and decimal formatting.
  • Add a rich text description to a widget.
Apply a dashboard theme

Right now, every widget uses Databricks default styling. A dashboard theme lets you control colors, fonts, and widget styling across all pages from one place.

  • Click the gear icon in the upper-right corner of the dashboard editor to open Dashboard settings.
  • Under Theme, click on the canvas background color and pick a color you like.

Pick colors with contrast

Choose a canvas background and widget background that contrast with each other. A light canvas with white widgets (or a dark canvas with slightly lighter widgets) keeps charts readable.

  • Set a widget background color that contrasts with your canvas.
  • Select a visualization color palette that works well together.

Now scroll down to the font settings.

  • Under Fonts, select a font family from the dropdown.
  • Click the Title tab and increase the font size and weight so titles stand out.
  • Click back to the canvas.

Your theme applies to all existing widgets automatically. Both the Summary and Deep Dive pages now share the same colors, fonts, and styling.

Why set a theme instead of styling each chart?

A theme applies to every widget at once, including any you add later. This keeps your dashboard consistent without repeating the same formatting work on each chart. Any changes you make to the theme propagate to all widgets automatically.

🙋‍♀️ Not seeing the theme change?

Make sure you clicked back to the canvas after adjusting the theme settings. The preview in the settings panel may look different from the actual canvas. If colors seem unchanged, check that you adjusted the canvas Background and widget Background separately.

Why doesn't my theme look right on the canvas?

Format chart axes and add descriptions

Your theme handles the big picture, but each chart still needs clear axis titles and formatted numbers. Viewers should never have to guess what an axis represents.

  • Click the Summary page tab.
  • Click the line chart to select it.

The Y axis title is already set to Average Fare ($) from a previous step. Now you'll format how the axis tick labels display their numbers.

  • In the Visualization Configuration panel, click Format next to the Y axis field.
  • Switch to Custom and set decimal places to 2.

The Y axis tick labels now display values with exactly two decimal places, like 11.50 instead of 11.5012.

  • Click the Deep Dive page tab.
  • Click the scatter plot to select it.
  • Set the X axis title to Trip Distance (miles).
  • Set the Y axis title to Fare Amount ($).

The scatter plot now has descriptive labels instead of raw column names like trip_distance and fare_amount.

  • With the scatter plot still selected, look for the point opacity or transparency setting in the chart configuration.
  • Set the opacity to around 0.3 to 0.5. This reduces overplotting so dense clusters of trips stand out instead of stacking into an opaque blob.

Fight overplotting with transparency

Thousands of taxi trips overlap at common fare-distance combinations. Without reducing opacity, the densest clusters look identical to sparse ones because every dot is fully opaque. Setting opacity to 0.3–0.5 lets overlapping points build up visually, so the true density of the data shows through.

  • Click the heatmap to select it.
  • Set the X axis title to Hour of Day.
  • Set the Y axis title to Day of Week.

Both Deep Dive charts now have clear, human-readable axis titles.

Why do axis titles matter?

Raw column names like pickup_hour mean nothing to a stakeholder reading your dashboard for the first time. A clear title like Hour of Day removes that friction entirely.

💡 Use a sequential color ramp for the heatmap

If your heatmap uses a rainbow gradient, consider switching to a sequential single-hue ramp (for example, light blue to deep navy). Rainbow gradients can obscure subtle differences between adjacent cells because the human eye does not perceive hue changes as a linear scale. A single-hue ramp makes high-volume cells pop immediately.

The last touch is adding a text description so viewers understand what a chart shows without asking.

  • Click the Summary page tab.
  • Click on the line chart's title area to start editing. A formatting toolbar appears above the widget.
  • Click below the title text to place your cursor in the description field.
  • Type a description such as: Weekly trend of average fare amount for trips under 10 miles and $50.

The widget now shows a descriptive subtitle that tells viewers exactly what the chart represents.

What is rich text in widget descriptions?

Widget titles and descriptions support rich text formatting. You can apply bold, italic, font changes, links, and even tables using the formatting toolbar. You can also type Markdown syntax directly.

🙋‍♀️ Can't see the description on your widget?

If your widget is only one row tall, the description appears as a tooltip behind an information icon instead of inline. Make the widget taller by dragging its bottom edge to show the description directly.

Why isn't my widget description showing up?

Verify your polished dashboard

Before you check the final result, think about what should be different now compared to when you started this step. What should you see on both pages?

  • Click through both the Summary and Deep Dive page tabs.

Both pages display with consistent theming. Colors, fonts, and widget styling match across all charts. Every axis has a clear title. The line chart's Y axis shows values with two decimal places. At least one widget has a rich text description explaining what it shows.

Secret mission

Build a Custom Vega-Lite Gauge

Your dashboard's counters and charts tell a great story, but executives love gauges. In this Secret Mission, you will build a custom Vega-Lite gauge visualization that shows the average fare against a target value, with color-coded fill that shifts from red to yellow to green. This takes you beyond the built-in chart types and into code-based visualization design.

Clean Up Your Resources

Clean Up Your Resources

This project runs entirely on the Databricks Free Edition, so there are no ongoing costs. Decide whether to keep your dashboard in your workspace, come back to it later, or delete it entirely.

Resources you used:

  • One AI/BI dashboard (draft and published versions) with two pages (Summary and Deep Dive) in your Databricks workspace.
  • SQL datasets (trips_base and weekly_trends, plus gauge_data if you completed the Secret Mission) defined within the dashboard.

Keep everything running

No action needed. Your dashboard stays in your Databricks workspace indefinitely at no cost.

  • Your draft dashboard remains editable in the Databricks sidebar under Dashboards.
  • The published version is live at the shareable link you copied earlier. Anyone registered to your Databricks account can view it.
  • All SQL datasets and visualizations are stored within the dashboard at no charge.

Pause - I'll come back to this later

Your dashboard is stored in the Databricks Free Edition workspace at no cost. There are no running processes or ongoing charges to pause.

  • Your dashboard, datasets, and visualizations will be waiting in your workspace exactly as you left them.
  • When you return, find your dashboard in the Databricks sidebar under Dashboards.

Delete - I don't want to use this again

Deleting the dashboard removes the published version and all SQL datasets defined within it (trips_base, weekly_trends, and gauge_data).

  • In the Databricks sidebar, click Dashboards to find your dashboard.
  • Click the kebab menu (three dots) on the dashboard.
  • Select Move to Trash.

What about the sample data?

The samples.nyctaxi.trips table is a built-in Databricks sample dataset. It is part of your workspace by default and cannot be deleted.

That's a Wrap!

That's a Wrap!

Nice work! You've transformed a basic Databricks dashboard into a polished, interactive, two-page analytics tool that's ready to present in a meeting.

You've learned how to:

  • Build a two-page dashboard with focused layouts and KPI counter widgets with sparklines and format templates that show headline metrics at a glance.
  • Create advanced visualizations including a heatmap that reveals trip patterns by hour and day of week, and a scatter plot with color-coded data points showing the fare-to-distance relationship.
  • Add cross-filtering, filter widgets, and a professional dashboard theme with custom colors, fonts, and formatted axes to make your dashboard presentation-ready.
  • Secret Mission: Built a custom Vega-Lite gauge visualization that displays average fare against a target value with color-coded fill that shifts from red to yellow to green.

Ready to quiz yourself?