Skip to content
KONIGI Patterns

Dashboards / Key measures / Ranked list

‹ 4 of 7 ›

Ranked list

People need to find the items contributing most to a result.

Updated September 9, 2026

Problem

People need to find the few items contributing most to a problem or total within a large set.

Solution

Order items by a clearly named measure and show their values. If only the top items are shown, state the limit and how much of the total they represent.

Make the time range and filters visible. Include an Other total or a path to the full list so omitted items do not disappear from the reading.

Avoid moving rows while someone is inspecting them. Let people open an item for details and make refresh behavior clear.

Use when

A small set of items accounts for a useful share of the result and people need to prioritize investigation.

Don’t use when

The values are close together. Ten items within a few percent of each other produce a ranking that is noise given an ordering, and readers treat position as meaningful whether or not it is. Show the distribution instead. Also don’t rank when the set is small enough to show entirely.

Trade-offs

Nearby ranks may differ by very little. A cutoff hides the next item as completely as the last, and gradual problems in the remainder may be overlooked. Frequent reordering makes the list hard to read.

Checklist

  • Why N? Is it ten because ten is the answer or because ten fits?
  • Is the total, or each item’s share of it, visible?
  • Is there an “other” row, and does it carry the count of what’s in it?
  • Is the ranking over the whole window, and would a per-interval ranking say something different?
  • How stable is the membership between refreshes, and is the list readable while it updates?
  • Are ties broken deterministically, so the order doesn’t jitter?
  • Can two adjacent rows be distinguished, or are they within noise?
  • Can the viewer click through to the item, and do they land somewhere scoped correctly?
  • What’s the cardinality of this dimension, and does the query hold up at that cardinality?
  • Does the list say what it’s ranked by, in the units the viewer thinks in?

Compare

Grafana builds this out of a bar gauge or a sorted table, which means the “other” row and the share-of-total are things whoever wrote the query has to remember, and they usually don’t. Honeycomb treats ranking as a step inside the analysis loop rather than a finished panel, so a top-N is somewhere you group by a dimension and then keep going, which suits a high-cardinality field where the interesting item was never in anyone’s top ten. Sentry ranks issues by event count and keeps a sparkline on each row, so the list carries shape as well as order and a spiking issue at position twelve is still visible. Netdata ranks per-node and per-second, so the list turns over fast enough that it reads as a live view rather than a standing. Cloudflare Radar strips the magnitudes out entirely: its top tens are a number, a name and nothing else, with no bar and no share of total. That is the most aggressive answer available to the question this pattern raises, and it holds up because for a reader who came for one fact the rank genuinely is the whole finding.

Data table supports the full set and other sort orders. Drill-down opens an item. Filter bar defines the population being ranked.

Stacked composition shows shares visually. Cross-filter uses an item to narrow other panels.

Ranked list anatomy A top-five list of endpoints by error count, with a share-of-total column, a cut line, and an "other" row below it accounting for the remaining twenty-one percent across 2,140 endpoints. Anatomy Errors · last 1 hour Share 1 2 1 /api/checkout 41% 3 2 /api/search 19% 3 /api/cart 9% 4 /api/user 6% 5 /api/feed 4% 4 other · 2,140 endpoints 21% 5 1 RANKED BY The measure and the window. Top ten over an hour is not the top ten at any moment in it. 2 SHARE OF TOTAL Turns a leaderboard into an answer. 3 ROW Rank, name, value. The bar is optional; it only earns space if the top item dwarfs the rest. 4 THE CUT Where N stops. Arbitrary unless you say why. 5 OTHER The row almost every list omits. Without it, a heavy tail and a flat one look the same. Over a high-cardinality dimension the membership churns on every refresh.
Wireframe — the pattern's anatomy, not any one product's version of it

Implementation

A top-N is a table that has given up sorting. The rank is the finding, so the bar is drawn inside the row rather than beside it, and the tail is named instead of being silently dropped.

Tokens
--card--card-foreground--muted-foreground--border--status-warn--chart-1
Errors · last 1 hourShare
  1. 141%
  2. 219%
  3. 39%
  4. 46%
  5. 54%
other · 2,140 endpoints21%

RankedList.tsxTakes the top rows, the total and the cardinality, and computes each share and the other row from them. The window is a required prop.

export type Ranked = { name: string; value: number };

/**
 * Sort descending, cut at N, and account for the cut. The list takes the
 * top rows plus two numbers the query already knows, the total and the
 * cardinality, so it can draw the "other" row every leaderboard omits. Without
 * that row a heavy tail and a flat one look the same.
 */
export function RankedList({ measure, window, top, total, cardinality, noun, onSelect }: {
  /** What the rows are ranked by, in the viewer's units. "Errors". */
  measure: string;
  /** The window the ranking covers. Top five over an hour is not the top
   *  five at any moment in it, so the window is required, not a caption. */
  window: string;
  /** The rows above the cut. Sorted here, ties broken by name so the order
   *  never jitters between refreshes. */
  top: Ranked[];
  /** Sum of the measure across every item, above and below the cut. */
  total: number;
  /** How many items the dimension has. The other row carries the count. */
  cardinality: number;
  /** What an item is called: "endpoints", "tenants", "queries". */
  noun: string;
  onSelect?: (name: string) => void;
}) {
  const rows = [...top].sort((a, b) => b.value - a.value || a.name.localeCompare(b.name));
  const above = rows.reduce((n, r) => n + r.value, 0);
  const other = { value: total - above, count: cardinality - rows.length };
  const pct = (v: number) => `${Math.round((v / total) * 100)}%`;
  // Bars are scaled to the top row, so the lead's size is the first thing read.
  const bar = (v: number) => ({ width: `${(v / rows[0].value) * 70}px` });

  return (
    <div className="w-[340px] rounded-lg border bg-card p-4">
      <div className="flex items-baseline justify-between border-b pb-2 text-[11px] uppercase tracking-wide text-muted-foreground">
        <span>{measure} · {window}</span>
        <span>Share</span>
      </div>
      <ol className="mt-1">
        {rows.map((r, i) => (
          <li key={r.name} className="flex items-center gap-2 py-1.5 text-xs">
            <span className="w-3 tabular-nums text-muted-foreground">{i + 1}</span>
            <button type="button" onClick={() => onSelect?.(r.name)} disabled={!onSelect}
              className="w-24 truncate text-left text-card-foreground enabled:hover:underline" title={`${r.value.toLocaleString("en-GB")} ${measure.toLowerCase()}`}>
              {r.name}
            </button>
            <span className="h-2 rounded-[1px] bg-chart-1" style={bar(r.value)} />
            <span className="ml-auto tabular-nums text-card-foreground">{pct(r.value)}</span>
          </li>
        ))}
      </ol>
      {other.count > 0 && (
        <div className="mt-1 flex items-center gap-2 border-t border-dashed pt-2.5 text-xs text-status-warn">
          <span>other · {other.count.toLocaleString("en-GB")} {noun}</span>
          <span className="h-2 rounded-[1px] bg-status-warn" style={bar(other.value)} />
          <span className="ml-auto tabular-nums">{pct(other.value)}</span>
        </div>
      )}
    </div>
  );
}

demo.tsxHow it is called: five endpoints out of 2,145, ten thousand errors in the hour.

import { RankedList } from "./RankedList";

/**
 * Ten thousand errors in the last hour across 2,145 endpoints. Five of them
 * account for 79%; the other row says what the remaining 2,140 add up to.
 */
export default function Demo() {
  return (
    <RankedList
      measure="Errors"
      window="last 1 hour"
      top={[
        { name: "/api/checkout", value: 4100 },
        { name: "/api/search", value: 1900 },
        { name: "/api/cart", value: 900 },
        { name: "/api/user", value: 600 },
        { name: "/api/feed", value: 400 },
      ]}
      total={10_000}
      cardinality={2145}
      noun="endpoints"
      onSelect={(name) => console.log("open", name)}
    />
  );
}
What it renders. Identical markup in both panes, with only the token values changing.

Examples

Screenshots are grouped by product and include the capture date. Dashed boxes highlight this pattern. Notes appear below each screenshot and when you hover over a box.

Cloudflare Radar

Public internet-traffic dashboards with location and time controls and links from summaries to detailed views.

Worldwide Overview September 11, 2026 Public site, signed out; no version string exposed medium · light · desktop-web
Radar’s overview uses location and time controls to set the scope of the page. Each summary panel links to a fuller section, making the page a starting point for further reading. Values are printed above the charts, so people can read figures without estimating them from marks. The bot and human shares, for example, are both labeled beside their bar.
Show 3 more examples Hide the rest

Grafana

Examples of panel grids, shared selectors, stat tiles, and chart configuration.

Examples / Polystat Visualization Showcase September 10, 2026 Grafana Play (signed out; no version string exposed) medium · dark · desktop-web
This showcase displays the same threshold-colored cells in several shapes. Hexagons touch along their edges, while circles leave gaps, changing how adjacent cells form visible groups. The choice matters when scanning many items together. Other panels demonstrate named states, sorting, and label-only cells, each emphasizing a different part of the reading.
  • Host map Touching hexagons make adjacent cells read as a group.
  • Host map Circles leave gaps between neighboring cells.
  • Semantic status color Cell fills represent OK, warning, and critical states.
  • Ranked list Descending order brings the highest values first.
  • KPI tile Label-only cells show a name and color without a numeric value.

Plausible Analytics

A metric row controls the main chart, followed by focused traffic breakdowns.

Live demo / plausible.io September 10, 2026 Plausible live demo, plausible.io's own stats (signed out) medium · light · desktop-web
The metric row controls the main chart: the selected tile is outlined and its series appears below. Supporting sections then break the results down by source, page, geography, and other categories. Ranked lists show counts and bars, but no visible share of the total. The map uses very pale colors for most countries, limiting how much variation is easy to see.

Tableau Public

Published workbooks show how individual authors arrange charts and interactions in Tableau.

Shopify Customer Journey September 10, 2026 Tableau Public embed view; workbook published by Lovelytics medium · light · desktop-web
This Lovelytics workbook uses clickable metrics and bars to filter or reveal detail. Instructions explain these interactions because the marks do not clearly look interactive. Nine summary values compete for attention in a grid. The sales chart also has a mismatch between its monthly title and the displayed dates, while its truncated vertical scale emphasizes variation. These choices make labels and interaction cues especially important.
  • Cross-filter An instruction explains that metric tiles filter the dashboard.
  • Header KPI strip Nine values share a grid without a clear starting priority.
  • Time series The title and displayed period differ, and the vertical axis starts above zero.
  • Hover detail City details are described as available on hover.
  • Geo map with markers The map shows raw sales totals, which also reflect differences between populations.
  • Ranked list One much larger value leaves the remaining bars difficult to compare.