Skip to content
InsightCharts

Search

Search guides and components

Lollipop chart

Ranks categories with a dot on a thin stem from zero, or as a stemless dot plot on a free scale.

Use when
Rankings of 8 to 30 categories where bars would be too heavy; dot plot mode when the values sit far from zero and the differences between them matter, or to compare a few series per row.
Avoid when
Fewer than about 6 categories or part-to-whole stacks (use bar chart); exactly two values per row where the difference between them matters (use dumbbell chart); change over time (use line chart).

Preview

27% of trips in the Netherlands are made by bike

Share of all trips made by bicycle

Source: National travel surveys, latest available year (rounded) · Figures are approximate, for illustration

Composition

Used in

No molecule or template lists lollipop chart in its composes. It still fits any slot that takes a component.

Installation

$ pnpm dlx shadcn@latest add @insightcharts/lollipop-chart

The CLI copies the source into your project and needs the @insightcharts registry in components.json; see installation. With the package, import it by name:

import { LollipopChart } from "insightcharts";

Examples

Dot plot on a non-zero scale, highlighted

Life expectancy in the United States was 78.4 years in 2023

Life expectancy at birth, years, 2023. The scale does not start at zero.

Source: OECD Health Statistics (rounded) · Figures are approximate, for illustration

Long format, three dots per row

82% of people over 55 trust nurses

Share who say they trust each profession, by age group

Illustrative figures.

Vertical, over time

There were 28 orbital launch attempts in December 2024

Orbital launch attempts worldwide per month, 2024

Illustrative figures.

Stress: 26 rows with long names

Community and social service occupations have 960,000 projected openings a year

Projected annual job openings, thousands

Illustrative figures.

Props

PropTypeDefaultDescription
xrequiredstringCategory field.
yrequiredstring | string[]Value field. Several fields draw several dots per row (dot plot).
seriesstringField that splits rows into series (long data). Forces the dot plot.
stembooleantrueStem from zero. false draws a dot plot whose scale need not start at zero.
orientation"auto" | "horizontal" | "vertical""auto"Horizontal for rankings, vertical for dates.
sort"none" | "asc" | "desc"Row order. Default: descending for rankings, data order for dates.
labelsbooleanValue beside each dot. Default: on for one series of up to 16 rows.
namesRecord<string, string>Display names for series keys.
Common chart props 29

Every chart built with defineChart accepts these on top of its own props.

PropTypeDescription
dataDataInputRows, CSV text, a URL, { url, path }, an async function, or an Arrow-style table. Omit inside <InsightData>.
transformTransform | Transform[]A pipeline of transforms applied before drawing.
titlestringThe title. One plain statement of what the data shows, with the number and the period ("Monthly churn fell from 4.2% to 2.1% in 2024"), or a plain label ("Monthly churn, 2024"). One clause, no figures of speech.
subtitlestringMeasure, unit, population, period.
sourcestringData source, shown as "Source: ...".
notestringMethod notes or caveats.
heightnumber | stringCSS height of the plot. Default 360.
aspectnumberWidth / height. Overrides height.
highlightstring | string[]The entity (or entities) the title is about. Every other series is drawn in grey.
annotationsAnnotation[]Reference lines, shaded bands and callouts, in data coordinates.
formatFormatSpecHow to print values: "compact", "percent", "currency:USD", "{value} kg", Intl options, or a function.
legendbooleanShow the legend. Default: shown when there are two or more series.
selectboolean | stringMake marks clickable to filter. Inside <InsightData> the selection filters every other chart. Pass a field name, or true to use the chart's category field.
onSelect(values: string[], field: string) => voidCalled with the selected values whenever the selection changes.
optionEChartsOption | ((option: EChartsOption, ctx: BuildContext) => EChartsOption)Deep-merged over the generated ECharts option, or a function that receives and returns it. Use it for ECharts settings no prop covers.
themeThemeInputA theme, or a partial set of tokens merged over the surrounding theme, for this chart only.
modeModeInput"auto" (default) follows the page, "system" follows the OS, or force "light" / "dark".
rendererRendererInput"auto" (default) uses SVG for light charts and canvas for heavy ones.
animatebooleanSet false to disable animation. Reduced-motion preferences are always respected.
lazybooleanMount the chart only when it scrolls near the viewport. Default true.
groupstringLink tooltips with other charts sharing this group id.
exportableboolean | ExportFormat[]Show an export menu: true or a list of formats from png, jpeg, svg, pdf, csv, json.
tablebooleanShow a collapsible "View data" table under the chart.
altstringAccessible description: the chart type and measures, then the main pattern and the notable values.
idstringStable id for this chart's selection in the shared store.
onEventsRecord<string, ChartEventHandler>ECharts event handlers, e.g. { click: (params, chart) => {} }. Prefix a name with zr: to bind to the canvas itself.
onReady(chart: EChartsInstance) => voidCalled with the ECharts instance once it is created.
classNamestringClass name for the outer <figure>.
styleCSSPropertiesInline style for the outer <figure>.