FPMS Visuals Catalog — built directly from SQL outputs
Every visual below is generated from one of the 13 SQL view outputs you shared, and now ships with a sample on-card preview so reviewers can see the intended Power BI tile before it is built. Each card lists the source view, the Power BI visual type, the fields to drop onto each well, and the exact build steps — using only standard visuals (no marketplace, Python, R, or Deneb). Visual rules follow §11 of the FPMS PBI Design Spec: one ranking truth per page, DataCoverageStatus = 'VALID' filter shells, and no DAX re-ranking on top of SQLFleetEfficiencyRank.
HIMS_IQ_FPMS_ShipEfficiencyRanking_FullCoverage
File · HIMS_IQ_FPMS_ShipEfficiencyRanking_FullCoverage.xlsx · Grain · 1 row per ShipCode × LadenBallast (full fleet coverage incl. UNAVAILABLE) · Rows · 90
Fleet Efficiency Ranking (Bar)
Compare every vessel's Benchmark Efficiency Rank within Laden / Ballast.
- LadenBallast = L (page-level slicer)
- DataCoverageStatus = VALID
- Insert → Clustered bar chart.
- Y-axis: VesselName · X-axis: RelativeEfficiencyPct.
- Legend: EfficiencyClass (TOP / ABOVE_AVG / AVERAGE / BELOW_AVG / BOTTOM).
- Sort by BenchmarkEfficiencyRank ascending.
- Conditional format data colors → categorical map by EfficiencyClass.
- Add reference line at 0% (fleet avg).
- Tooltips: BenchmarkQuality, MaturedThroughYear, PredictionReliabilityScore.
Ranking Matrix · Benchmark vs Monitor
Cross-check who ranks well on benchmark but poorly on monitor (and vice versa).
- LadenBallast slicer
- Insert → Matrix.
- Rows: VesselName · Columns: (none) · Values listed above.
- Conditional format: data bars on RelativeEfficiencyPct and CurrentDeviationPct.
- Icons on Rolling90DayUnifiedEfficiencyBand (Green / Amber / Red).
- Add a calculated column RankGap = BenchmarkEfficiencyRank − MonitorDeviationRank_ByMode and color the cell.
Rank Gap = Ranking[BenchmarkEfficiencyRank] - Ranking[MonitorDeviationRank_ByMode]
Benchmark Efficiency vs Current Deviation (Scatter)
Spot the four quadrants: efficient & stable, efficient & drifting, weak & stable, weak & drifting.
- Insert → Scatter.
- Details: VesselName · X: RelativeEfficiencyPct · Y: CurrentDeviationPct.
- Size: PredictionReliabilityScore · Legend: ShipType.
- Add X reference line at 0 (fleet avg) and Y reference line at 0 (matching benchmark).
- Use Analytics pane → median lines for both axes to draw quadrants.
Efficiency Class Distribution (Donut)
% of fleet in TOP / ABOVE / AVERAGE / BELOW / BOTTOM.
- LadenBallast slicer
- Insert → Donut.
- Legend: EfficiencyClass · Values: ShipCode (Count distinct).
- Detail labels: Category, percent of total.
Action Recommendation Table
Operations-ready action list with reason code.
- Insert → Table.
- Sort by CurrentDeviationPct descending.
- Conditional format icon on PrimaryReasonCode and color FinalActionRecommendation.
- Filter pane: RankingCoverageStatus = FULL_RANK_AVAILABLE.
Data Coverage Funnel
Show how many vessels drop out at each gate (benchmark → monitor → ranking).
- Build measures (below) and place on a Funnel chart in stage order.
Stage1 Total Vessels = DISTINCTCOUNT(Ranking[ShipCode])
Stage2 Benchmark Available = CALCULATE([Stage1 Total Vessels], Ranking[BenchmarkAvailable]="YES")
Stage3 Monitor Covered = CALCULATE([Stage1 Total Vessels], Ranking[MonitorCoveragePct] > 0)
Stage4 Full Rank = CALCULATE([Stage1 Total Vessels], Ranking[RankingCoverageStatus]="FULL_RANK_AVAILABLE")
HIMS_IQ_FPMS_ShipDecisionTable
File · HIMS_IQ_FPMS_ShipDecisionTable.xlsx · Grain · 1 row per ShipCode × LadenBallast (decision-grade summary) · Rows · 90
Recommendation Treemap
Show fleet split by FinalActionRecommendation, sized by count.
- Insert → Treemap.
- Group: FinalActionRecommendation · Details: PrimaryReasonCode · Values: Count of ShipCode.
- Color by FinalActionRecommendation (red = ACTION, amber = INVESTIGATE, green = MONITOR).
Decision KPI Cards
Headline counts at the top of the page.
- Use measures below in a multi-row card.
Vessels = DISTINCTCOUNT(Decision[ShipCode])
Action Count = CALCULATE([Vessels], Decision[FinalActionRecommendation]="ACTION_REQUIRED")
Action % = DIVIDE([Action Count],[Vessels])
Avg ROEI = AVERAGE(Decision[RollingOperationalEfficiencyIndex])
Avg Sign Consistency = AVERAGE(Decision[SignConsistencyPct])
Deviation vs Hull-Cleaning Recency (Quadrant)
Identify vessels overdue for cleaning that are also drifting.
- Scatter with reference line X = 180 days and Y = 5%.
- Quadrant top-right = priority cleaning candidates.
YoY Trend Distribution (Stacked Column)
How many vessels are IMPROVING / FLAT / DEGRADING per ShipType.
- Drag fields as listed; sort legend manually (IMPROVING, FLAT, DEGRADING).
Prediction Reliability Heatmap
Matrix of vessels × reliability score colored by validation status.
- Rows: VesselName · Columns: LadenBallast · Values: PredictionReliabilityScore.
- Conditional format background by value (0–40 red, 40–70 amber, 70–100 green).
HIMS_IQ_FPMS_RelativeEfficiencyIndex_FullCoverage
File · HIMS_IQ_FPMS_RelativeEfficiencyIndex_FullCoverage.xlsx · Grain · 1 row per ShipCode × LadenBallast (full coverage with DataCoverageStatus) · Rows · 90
REI Tornado (% better/worse than fleet)
Diverging bar showing each vessel's RelativeEfficiencyPct vs fleet (0%).
- Bar chart sorted by RelativeEfficiencyPct ascending.
- Add reference line at 0.
- Use conditional data colors: positive = green, negative = red.
- Filter DataCoverageStatus = VALID.
REI Color = IF(SELECTEDVALUE(REI[RelativeEfficiencyPct]) >= 0, "#2BB673", "#E2483D")
Normalized Consumption vs Speed Range
Where each vessel sits relative to fleet average on its used speed window.
- Plot one dot per vessel; size = SampleCount_Consumption.
- Add Y reference line = FleetAvgNormalizedConsumptionMtPerDay (use a measure with CALCULATE / ALL).
Fleet Norm Cons = CALCULATE(AVERAGE(REI[FleetAvgNormalizedConsumptionMtPerDay]), ALL(REI))
Efficiency Class Heat Strip
Compact strip showing every vessel as a colored block, sorted by rank.
- Matrix: Columns = VesselName, Values = RelativeEfficiencyPct.
- Sort Columns by BenchmarkEfficiencyRank.
- Background color formatting: diverging red→white→green centered at 0.
Coverage KPI Strip
Tell management 'X of 45 vessels have a valid REI'.
- Use the FullCoverage view; build measures filtering on DataCoverageStatus.
Valid REI Vessels = CALCULATE(DISTINCTCOUNT(REI[ShipCode]), REI[DataCoverageStatus]="VALID")
Unavailable = CALCULATE(DISTINCTCOUNT(REI[ShipCode]), REI[DataCoverageStatus]<>"VALID")
HIMS_IQ_FPMS_FuelLossForecastSummary_FullCoverage
File · HIMS_IQ_FPMS_FuelLossForecastSummary_FullCoverage.xlsx · Grain · 1 row per ShipCode × LadenBallast (forecast extra fuel/USD) · Rows · 90
Forecast Loss Headline Cards
Total expected extra fuel (MT) and USD across fleet for the horizon.
- Use sum measures filtered by DataCoverageStatus = VALID.
Total Extra Fuel MT = CALCULATE(SUM(Forecast[TotalForecastExtraFuelMt]), Forecast[DataCoverageStatus]="VALID")
Total Forecast USD = CALCULATE(SUM(Forecast[TotalForecastExtraFuelUSD]), Forecast[DataCoverageStatus]="VALID")
Top 10 Loss Contributors
Identify worst-case vessels for the planning horizon.
- Top N = 10 by TotalForecastExtraFuelUSD
- Insert bar chart, apply Visual-level filter Top N = 10 on TotalForecastExtraFuelUSD.
- Data labels formatted as $#,##0.
- Drill-through enabled on VesselName → Vessel detail page.
Forecast Reset Reason Breakdown
Show why each forecast was reset (hull cleaning, profile change, etc.).
- Donut, legend = ForecastResetReason, values = count distinct ShipCode.
Forecast Window Gantt
See each vessel's forecast horizon visually.
- Create measure DaysToStart = DATEDIFF(TODAY(), ForecastStartDate, DAY).
- Stacked bar: invisible series 'DaysToStart' first, then 'ForecastDaysAvailable' colored.
- Sort by ForecastStartDate.
Days To Start = DATEDIFF(TODAY(), MAX(Forecast[ForecastStartDate]), DAY)
Forecast Loss by Drydock Maturity
Group by MaturedThroughYear (Y1..Y5) to see lifecycle pattern.
- Column chart by MaturedThroughYear, legend LadenBallast.
HIMS_IQ_FPMS_HullCleaningImpact
File · HIMS_IQ_FPMS_HullCleaningImpact.xlsx · Grain · 1 row per ShipCode × LadenBallast × HullCleaningSequence · Rows · 64
Pre vs Post Cleaning Deviation (Dumbbell)
Visualize improvement per event.
- Unpivot PreCleaningDeviationPct and PostCleaningDeviationPct in Power Query → columns become 'Phase' + 'Value'.
- Clustered bar by ShipCode+Date with legend = Phase.
- Sort descending by HullCleaningBenefitPct.
Benefit % by Vessel (Waterfall-style Bar)
Rank cleaning events by % benefit.
- HullCleaningImpactStatus = IMPROVED_AFTER_CLEANING
- Filter to IMPROVED_AFTER_CLEANING only.
- Bar sorted descending; data labels = HullCleaningBenefitPct %.
Impact Status Mix
Cleaning events grouped by outcome (improved / insufficient data / no change).
- Donut chart; legend = HullCleaningImpactStatus.
Cleaning Events Timeline
Show event distribution over time and detection method.
- Scatter: X = HullCleaningDate, Y = VesselName.
- Color by EventDetectionMethod; size by HullCleaningBenefitPct.
Cleaning Sequence Effectiveness
Are repeat cleanings (#2, #3) delivering less benefit than first?
- Column chart with X = HullCleaningSequence, Y = avg benefit %.
HIMS_IQ_FPMS_MasterPrediction_Canonical
File · HIMS_IQ_FPMS_MasterPrediction_Canonical.xlsx · Grain · 1 row per report (ShipCode × Report_Date × VoyageNumber × LadenBallast) · Rows · 5,760
Speed vs Consumption Timeseries (Actual vs Predicted)
Per-vessel timeseries with a vertical reference line at LastHullCleanDate.
- VesselName slicer
- LadenBallast slicer
- Line chart; X-axis Report_Date (continuous).
- Two lines: Actual and Predicted.
- Analytics pane → add Constant line for hull-clean date. To make it dynamic, create measure HullCleanX = MAX(Master[LastHullCleanDate]) and use 'X-axis Constant Line' = measure.
- Drop SpeedKnots into a secondary line on the same chart (dual-axis) or as tooltip.
Hull Clean X = CALCULATE(MAX(Master[LastHullCleanDate]), ALLSELECTED(Master))
Consumption Deviation % Trend
Track % deviation per report with a rolling 30-day average.
- Insert line chart; values include the rolling measure below.
- Add Y reference line at 0%.
Rolling 30d Deviation = AVERAGEX(DATESINPERIOD('Date'[Date], MAX('Date'[Date]), -30, DAY), CALCULATE(AVERAGE(Master[ConsumptionDeviationPct])))
Speed-Bin Heatmap (Consumption Deviation)
See which speed bins have systemic positive deviation.
- Matrix: Rows = VesselName · Columns = SpeedBin · Values = AVG(ConsumptionDeviationPct).
- Conditional format background diverging red↔green at 0%.
ISO 19030 Pass vs Fail by Vessel
Data-quality bar.
- 100% stacked column; legend ISO_Status.
ISO Fail Reason Pareto
Which fail reasons drive 80% of exclusions?
- Column: count of rows.
- Line: cumulative percentage measure.
- Sort by count descending.
Fail Count = CALCULATE(COUNTROWS(Master), Master[ISO_Status]="ISO_FAIL")
Nm/MT Actual vs Benchmark Timeseries
Efficiency view — higher is better.
- Line chart with both metrics; add hull-cleaning vertical reference line.
Annualized Loss USD Stacked by Mode
How much loss is laden vs ballast.
- Stacked area chart; format Y as currency.
Steaming Hours by Month
Utilisation overlay (TimeHours summed by month) with hull-clean line.
- Column chart with Report_Date grouped by month.
- Add Hull-clean reference line using the measure from mp-timeseries-cons.
Prediction Zone Distribution
How many reports are WITHIN_BENCHMARK_RANGE vs extrapolated.
- Donut; legend = PredictionZone.
HIMS_IQ_FPMS_MonitorPredictionAccuracy_R2
File · HIMS_IQ_FPMS_MonitorPredictionAccuracy_R2.xlsx · Grain · 1 row per ShipCode × LadenBallast · Rows · 90
R² per Vessel (Bar)
Show predictive accuracy ranking.
- Bar sorted descending by R².
- Reference lines at 0.5 and 0.8 (accuracy thresholds).
Monitor Accuracy Class Mix
Share of fleet in HIGH / MEDIUM / LOW accuracy.
- Donut; legend MonitorPredictionAccuracyClass.
Sample Size vs R² (Scatter)
Are low-R² vessels under-sampled?
- Scatter; reference line at R² = 0.5.
HIMS_IQ_FPMS_Vessel_NmPerMt_Forecast
File · HIMS_IQ_FPMS_Vessel_NmPerMt_Forecast.xlsx · Grain · 1 row per ShipCode × LadenBallast × PerformancePeriodType · Rows · 64
Nm/MT Actual vs Benchmark
Two-series bar per vessel; higher = better.
- Unpivot NmPerMt_Actual and NmPerMt_Benchmark in Power Query.
- Clustered bar; legend = Metric.
Period Type Comparison
Compare benchmark window vs monitor window per vessel.
- Rows: VesselName · Columns: PerformancePeriodType.
- Conditional bars on NmPerMt_Actual.
Distance vs Fuel (Bubble)
Total NM traveled vs total fuel — efficiency is the slope.
- Scatter; size = QualifiedSourceRows.
- Add trend line via Analytics pane.
HIMS_IQ_FPMS_Vessel_Performance_KPI_Computed
File · HIMS_IQ_FPMS_Vessel_Performance_KPI_Computed.xlsx · Grain · 1 row per ShipCode × LadenBallast × CalendarYear × CalendarMonth (monthly KPI) · Rows · 1,980
Monthly Actual vs Benchmark vs Predicted (Line)
Triple-line monthly trend per vessel — the canonical performance chart.
- VesselName slicer
- LadenBallast slicer
- Power Query: add column YearMonth = #date([CalendarYear],[CalendarMonth],1).
- Insert Line chart; X-axis = YearMonth (continuous).
- Plot three series; lock colors (Actual red, Benchmark blue, Predicted amber).
- Add Analytics reference band between Benchmark and Predicted to show 'expected envelope'.
Variance vs Benchmark Heatmap (Vessel × Month)
One-glance fleet heatmap showing every vessel-month deviation.
- Matrix: Rows = VesselName, Columns = YearMonth, Values = AVG(VarianceVsBenchmarkPct).
- Conditional format diverging Red-White-Green centered at 0%.
- Disable subtotals; freeze first column.
Monthly Excess Fuel Cost (Stacked Column by Mode)
Track $ leak per month, split L vs B.
- Stacked column; format Y axis as currency.
- Add data labels on totals only.
Operational Efficiency Index Over Time
Track OEI trajectory per vessel against fleet average.
- Line chart per vessel.
- Add Fleet Avg OEI measure as second (dashed) line.
Fleet Avg OEI = CALCULATE(AVERAGE(KPI[OperationalEfficiencyIndex]), ALL(KPI[VesselName]))
Deviation by Post-Drydock Year
How fleet variance evolves Y1 to Y5 after drydock.
- Column chart by PostDrydockYear; legend ShipType.
- Add error bars via Analytics (Std Dev).
Speed vs Consumption Scatter (Monthly Points)
Cloud of monthly points around the benchmark curve.
- Scatter chart; size = TotalTimeHours.
- Add trend line per Legend value.
Unified Efficiency Band — Vessel Months
Stacked area of vessel-months in GREEN / AMBER / RED.
- Stacked area chart; lock band colors (Green / Amber / Red).
HIMS_IQ_FPMS_Vessel_Performance_KPI_Forecast
File · HIMS_IQ_FPMS_Vessel_Performance_KPI_Forecast.xlsx · Grain · 1 row per ShipCode × LadenBallast × CalendarYear × CalendarMonth (forward months) · Rows · 830
Actual + Forecast Continuum (Line)
Append Computed (history) and Forecast (future) into a single timeline.
- Power Query: Append KPI_Computed and KPI_Forecast (both have KPIDataType column).
- Line chart split by KPIDataType so forecast renders dashed.
- Add vertical reference line at MAX(Computed YearMonth) labelled 'Today'.
Cutover Date = CALCULATE(MAX(KPI[YearMonth]), KPI[KPIDataType]="COMPUTED")
Forecast Excess Cost — Next 12 Months
Stacked column showing forward $ exposure per vessel.
- KPIDataType = FORECAST
- YearMonth <= TODAY + 12 months
- Stacked column; Top N filter on VesselName by SUM(ExcessFuelCostUSD).
- Currency format on values.
Forecast Reliability vs Predicted Loss
High-cost forecasts with low reliability deserve scrutiny.
- Scatter; reference lines at reliability=70 and a configurable USD threshold.
Forecast Mode Mix (Laden vs Ballast)
Donut of forecasted excess cost by mode.
- Donut; values formatted as currency.
HIMS_IQ_FPMS_YoY_Performance_FullCoverage
File · HIMS_IQ_FPMS_YoY_Performance_FullCoverage.xlsx · Grain · 1 row per ShipCode × LadenBallast × PostDrydockYear · Rows · 360
Deviation Trajectory by Drydock Year
AvgConsumptionDeviationPct across Y1 to Y5 per vessel.
- Line chart; X = PostDrydockYear (integer axis).
- Use small multiples (Format pane) for clarity.
YoY Deviation Change % (Diverging Bar)
Worst degraders at top, biggest improvers at bottom.
- Bar sorted descending by YoYDeviationChangePct.
- Color by YoYTrend (DEGRADING red, FLAT grey, IMPROVING green).
Fleet YoY Trend Mix
% of vessel-years improving vs degrading.
- Donut by YoYTrend.
Cumulative Excess Cost by Drydock Year
How $ leak compounds across the lifecycle.
- Stacked area by ShipType.
YoY Variance Status Matrix
Which vessels are flagged in which year.
- Rows = VesselName, Columns = PostDrydockYear, Values = YoYVarianceStatus.
- Conditional format icons (check / warn / cross).
HIMS_IQ_FPMS_Fleet_Ranking_FullCoverage (variants: _Computed, _Materialize, Export_*)
File · HIMS_IQ_FPMS_Fleet_Ranking_FullCoverage.xlsx (+ 4 sibling variants) · Grain · 1 row per ShipCode × LadenBallast × KPIDataType · Rows · 180
Fleet Leaderboard Table
Sortable league table — the executive home page.
- KPIDataType slicer (COMPUTED vs FORECAST)
- ShipType slicer
- Insert Table visual.
- Sort by FleetEfficiencyRank ascending.
- Data bars on OperationalEfficiencyIndex and AvgVarianceVsBenchmarkPct.
- Icons on FleetPerformanceCategory.
- Format TotalExcessFuelCostUSD as $#,##0.
Rank by Ship Type (Small Multiples Bar)
Compare QMAX vs QFLEX leaderboards side by side.
- Bar chart; Small multiples = ShipType.
- Sort by FleetEfficiencyRank_ByShipType ascending.
Cost Impact Rank vs Efficiency Rank (Scatter)
Spot vessels that are efficient yet costly (high utilisation) and vice versa.
- Scatter with both axes reversed (lower rank = better).
- Add a 45° reference line.
FleetPerformanceCategory Treemap
Share of fleet in each performance category.
- Treemap; details = VesselName.
Unified Efficiency Band by Ship Type
100% stacked column comparing band mix per ship class.
- 100% stacked column.
Coverage Reconciliation Cards (Materialize vs Computed)
Verify the materialized table matches the computed view.
- Load all three Fleet_Ranking variants as separate queries.
- Build measures using DISTINCTCOUNT against each loaded table.
- If they mismatch, raise a refresh alert via conditional formatting.
HIMS_IQ_FPMS_Fleet_Combined_Ranking_FullCoverage (variant: Export_*)
File · HIMS_IQ_FPMS_Fleet_Combined_Ranking_FullCoverage.xlsx (+ Export sibling) · Grain · 1 row per ShipCode (modes combined into one OperatingModeScope) · Rows · 45
Combined Fleet Ranking (Bar)
Single combined rank per vessel (L + B merged).
- Bar chart sorted by CombinedFleetEfficiencyRank.
- Color by UnifiedEfficiencyBand.
- Data label format: 0.00.
Cost Impact Pareto
Which 20% of vessels drive 80% of cost?
- Sort VesselName by TotalExcessFuelCostUSD descending.
- Column = TotalExcessFuelCostUSD.
- Line = cumulative % measure on secondary axis.
Cumulative Cost % = VAR _t = SUM(Combined[TotalExcessFuelCostUSD]) VAR _all = CALCULATE(SUM(Combined[TotalExcessFuelCostUSD]), ALLSELECTED(Combined)) VAR _running = CALCULATE(SUM(Combined[TotalExcessFuelCostUSD]), FILTER(ALLSELECTED(Combined), Combined[TotalExcessFuelCostUSD] >= _t)) RETURN DIVIDE(_running, _all)
Operating Mode Coverage
Which vessels have both L and B included vs only one mode.
- 100% stacked bar; legend IncludedModes (BOTH / L_ONLY / B_ONLY).
Actual vs Benchmark Fuel (Bar)
Two-bar comparison per vessel; gap = excess.
- Power Query: unpivot ActualConsumptionMT and BenchmarkConsumptionMT.
- Clustered bar; legend = Metric.
- Add ExcessMT as a data label.
Unified Band Mix
Distribution of the combined unified band across the fleet.
- Donut; legend UnifiedEfficiencyBand.
Repeatable build playbook
- In Power BI Desktop: Home → Get Data → Excel → load each HIMS_IQ_FPMS_*.xlsx sheet as its own query.
- Rename queries to match the SQL view name (no HIMS_IQ_FPMS_ prefix in the model).
- Mark ShipCode + LadenBallast as the relationship key across tables; create a Vessel dimension if you reuse VesselName/ShipType.
- Build a Date table (CALENDAR(MIN(Master[Report_Date]), MAX(Master[Report_Date]))) and mark it as the date table; relate it to Master[Report_Date].
- Page-level slicers everywhere: LadenBallast, ShipType, MaturedThroughYear, DataCoverageStatus.
- For every per-vessel chart, enable drill-through to a "Vessel Detail" page so the executive view collapses cleanly.
- Theme: use one dark theme JSON; categorical colors for EfficiencyClass / FinalActionRecommendation must be locked across all pages.
Send the next batch of SQL output files when ready — this catalog extends source-by-source without breaking the existing pages.