Charts · Distributions & comparisons
ConnectedScatterChart
| year | fare | riders |
|---|---|---|
| 2012 | 1.5 | 39.8 |
| 2013 | 1.62 | 41.8 |
| 2014 | 1.72 | 42.7 |
| 2015 | 1.85 | 44.7 |
| 2016 | 1.97 | 45.9 |
| 2017 | 2.09 | 47.6 |
| 2018 | 2.73 | 53.1 |
| 2019 | 2.42 | 58.2 |
| 2020 | 1.87 | 55.9 |
| 2021 | 2.26 | 48.6 |
| 2022 | 2.7 | 55.2 |
| 2023 | 2.83 | 56.3 |
| 2024 | 2.93 | 58.1 |
| 2025 | 3.05 | 59.6 |
| year | fare | riders |
|---|---|---|
| 2012 | 1.5 | 39.8 |
| 2013 | 1.62 | 41.8 |
| 2014 | 1.72 | 42.7 |
| 2015 | 1.85 | 44.7 |
| 2016 | 1.97 | 45.9 |
| 2017 | 2.09 | 47.6 |
| 2018 | 2.73 | 53.1 |
| 2019 | 2.42 | 58.2 |
| 2020 | 1.87 | 55.9 |
| 2021 | 2.26 | 48.6 |
| 2022 | 2.7 | 55.2 |
| 2023 | 2.83 | 56.3 |
| 2024 | 2.93 | 58.1 |
| 2025 | 3.05 | 59.6 |
| year | fare | riders |
|---|---|---|
| 2012 | 1.5 | 39.8 |
| 2013 | 1.62 | 41.8 |
| 2014 | 1.72 | 42.7 |
| 2015 | 1.85 | 44.7 |
| 2016 | 1.97 | 45.9 |
| 2017 | 2.09 | 47.6 |
| 2018 | 2.73 | 53.1 |
| 2019 | 2.42 | 58.2 |
| 2020 | 1.87 | 55.9 |
| 2021 | 2.26 | 48.6 |
| 2022 | 2.7 | 55.2 |
| 2023 | 2.83 | 56.3 |
| 2024 | 2.93 | 58.1 |
| 2025 | 3.05 | 59.6 |
| year | fare | riders |
|---|---|---|
| 2012 | 1.5 | 39.8 |
| 2013 | 1.62 | 41.8 |
| 2014 | 1.72 | 42.7 |
| 2015 | 1.85 | 44.7 |
| 2016 | 1.97 | 45.9 |
| 2017 | 2.09 | 47.6 |
| 2018 | 2.73 | 53.1 |
| 2019 | 2.42 | 58.2 |
| 2020 | 1.87 | 55.9 |
| 2021 | 2.26 | 48.6 |
| 2022 | 2.7 | 55.2 |
| 2023 | 2.83 | 56.3 |
| 2024 | 2.93 | 58.1 |
| 2025 | 3.05 | 59.6 |
Example
The chart above, in each framework. Pick a framework once and every example on the site follows it.
npm install @silverpoint/react @silverpoint/grounds @silverpoint/fontsimport '@silverpoint/fonts/fonts.css';
import '@silverpoint/grounds/styles.css';
import { ConnectedScatterChart } from '@silverpoint/react/connected-scatter-chart';
const data = [
{ year: 2012, fare: 1.5, riders: 39.8 },
{ year: 2013, fare: 1.62, riders: 41.8 },
{ year: 2014, fare: 1.72, riders: 42.7 },
{ year: 2015, fare: 1.85, riders: 44.7 },
{ year: 2016, fare: 1.97, riders: 45.9 },
{ year: 2017, fare: 2.09, riders: 47.6 },
{ year: 2018, fare: 2.73, riders: 53.1 },
{ year: 2019, fare: 2.42, riders: 58.2 },
{ year: 2020, fare: 1.87, riders: 55.9 },
{ year: 2021, fare: 2.26, riders: 48.6 },
{ year: 2022, fare: 2.7, riders: 55.2 },
{ year: 2023, fare: 2.83, riders: 56.3 },
// … 2 more rows of the same shape
];
export default function App() {
return (
<div style={{ width: 480 }}>
<ConnectedScatterChart
data={data}
xKey="fare"
yKey="riders"
labelKey="year"
title="Fare and ridership"
/>
</div>
);
}npm install @silverpoint/vue @silverpoint/grounds @silverpoint/fonts<script setup lang="ts">
import '@silverpoint/fonts/fonts.css';
import '@silverpoint/grounds/styles.css';
import { SpConnectedScatterChart } from '@silverpoint/vue/connected-scatter-chart';
const data = [
{ year: 2012, fare: 1.5, riders: 39.8 },
{ year: 2013, fare: 1.62, riders: 41.8 },
{ year: 2014, fare: 1.72, riders: 42.7 },
{ year: 2015, fare: 1.85, riders: 44.7 },
{ year: 2016, fare: 1.97, riders: 45.9 },
{ year: 2017, fare: 2.09, riders: 47.6 },
{ year: 2018, fare: 2.73, riders: 53.1 },
{ year: 2019, fare: 2.42, riders: 58.2 },
{ year: 2020, fare: 1.87, riders: 55.9 },
{ year: 2021, fare: 2.26, riders: 48.6 },
{ year: 2022, fare: 2.7, riders: 55.2 },
{ year: 2023, fare: 2.83, riders: 56.3 },
// … 2 more rows of the same shape
];
</script>
<template>
<div style="width: 480px">
<SpConnectedScatterChart
:data="data"
x-key="fare"
y-key="riders"
label-key="year"
title="Fare and ridership"
/>
</div>
</template>npm install @silverpoint/angular @silverpoint/grounds @silverpoint/fonts// src/styles.css:
// @import '@silverpoint/fonts/fonts.css';
// @import '@silverpoint/grounds/styles.css';
import { Component } from '@angular/core';
import { SpConnectedScatterChart } from '@silverpoint/angular/connected-scatter-chart';
@Component({
selector: 'app-root',
imports: [SpConnectedScatterChart],
template: `
<div style="width: 480px">
<sp-connected-scatter-chart
[data]="data"
xKey="fare"
yKey="riders"
labelKey="year"
title="Fare and ridership"
/>
</div>
`,
})
export class App {
protected readonly data = [
{ year: 2012, fare: 1.5, riders: 39.8 },
{ year: 2013, fare: 1.62, riders: 41.8 },
{ year: 2014, fare: 1.72, riders: 42.7 },
{ year: 2015, fare: 1.85, riders: 44.7 },
{ year: 2016, fare: 1.97, riders: 45.9 },
{ year: 2017, fare: 2.09, riders: 47.6 },
{ year: 2018, fare: 2.73, riders: 53.1 },
{ year: 2019, fare: 2.42, riders: 58.2 },
{ year: 2020, fare: 1.87, riders: 55.9 },
{ year: 2021, fare: 2.26, riders: 48.6 },
{ year: 2022, fare: 2.7, riders: 55.2 },
{ year: 2023, fare: 2.83, riders: 56.3 },
// … 2 more rows of the same shape
];
}pip install reflex-silverpoint-reactimport reflex as rx
from reflex_silverpoint_react import connected_scatter_chart
DATA = [
{"year": 2012, "fare": 1.5, "riders": 39.8},
{"year": 2013, "fare": 1.62, "riders": 41.8},
{"year": 2014, "fare": 1.72, "riders": 42.7},
{"year": 2015, "fare": 1.85, "riders": 44.7},
{"year": 2016, "fare": 1.97, "riders": 45.9},
{"year": 2017, "fare": 2.09, "riders": 47.6},
{"year": 2018, "fare": 2.73, "riders": 53.1},
{"year": 2019, "fare": 2.42, "riders": 58.2},
{"year": 2020, "fare": 1.87, "riders": 55.9},
{"year": 2021, "fare": 2.26, "riders": 48.6},
{"year": 2022, "fare": 2.7, "riders": 55.2},
{"year": 2023, "fare": 2.83, "riders": 56.3},
# … 2 more rows of the same shape
]
def index() -> rx.Component:
return rx.box(
connected_scatter_chart(
data=DATA,
x_key="fare",
y_key="riders",
label_key="year",
title="Fare and ridership",
),
width="480px",
)
app = rx.App()
app.add_page(index)Import
Each chart has its own subpath, so a bundle only carries the charts it uses. Every adapter also exports every chart from its barrel.
| Framework | Import |
|---|---|
| React | import { ConnectedScatterChart } from '@silverpoint/react/connected-scatter-chart'; |
| Vue | import { SpConnectedScatterChart } from '@silverpoint/vue/connected-scatter-chart'; |
| Angular | import { SpConnectedScatterChart } from '@silverpoint/angular/connected-scatter-chart'; // <sp-connected-scatter-chart> |
| Reflex | from reflex_silverpoint_react import connected_scatter_chart |
Props
The props ConnectedScatterChart adds to the ones every chart takes. Accessor props (…Key, keys, names) name fields of your rows and are ignored without data.
| React / Angular | Vue | Reflex | Type | Description |
|---|---|---|---|---|
xKey | x-key | x_key | Accessor<number | null | undefined> | — |
yKey | y-key | y_key | Accessor<number | null | undefined> | — |
labelKey | label-key | label_key | Accessor<string | null | undefined> | — |
arrows | arrows | arrows | boolean | Draws direction marks along the path; true by default. |
Common props
Every chart also takes these. Framework conventions: camelCase in React and Angular, kebab-case in Vue templates, snake_case in Reflex. Read more about them.
Show the 22 common props
| React / Angular | Vue | Reflex | Type | Description |
|---|---|---|---|---|
data | data | data | readonly Datum[] | Rows to draw. If omitted, the demo dataset is rendered (REQ-093) and the accessor props (…_key, keys, names) are ignored. |
ground | ground | ground | GroundRef | Style ground: silverpoint or cyanotype, or a ground object. Defaults to the app provider's, or silverpoint. |
substrate | substrate | substrate | SubstrateName | Prepared substrate within the ground (REQ-046). |
mode | mode | mode | InkMode | ink by default; precision disables inking (REQ-021). |
seed | seed | seed | Seed | Seed. If omitted, it is derived from id stably (REQ-003). |
id | id | id | string | Stable identifier. If omitted, it is generated deterministically. |
height | height | height | number | Height of the drawing area in px. Width is the container's unless pinned. |
width | width | width | number | — |
chrome | chrome | chrome | 'card' | 'bare' | card draws the full frame; bare only the drawing area (REQ-095). |
hatchFill | hatch-fill | hatch_fill | 'tile' | 'per-shape' | How areas are filled (REQ-029). |
title | title | title | string | — |
badge | badge | badge | string | — |
value | value | value | string | number | — |
unit | unit | unit | string | — |
footerLeft | footer-left | footer_left | string | — |
footerRight | footer-right | footer_right | string | — |
label | label | label | string | Accessible name. If omitted, it is derived from title (REQ-120). |
description | description | description | string | Long description for screen readers (REQ-120). |
dataTable | data-table | data_table | 'visible' | 'hidden' | 'none' | Tabular alternative; hidden leaves it for assistive technology only (REQ-121). |
locale | locale | locale | string | — |
numberFormat | number-format | number_format | Intl.NumberFormatOptions | — |
className | class-name | class_name | string | — |
Events
Pointer and keyboard exploration are built in. The item under the pointer or focus is reported, and a click, Enter or Space selects it. The item is { seriesKey, index, datum, value, point: { x, y } }.
| Framework | Active item | Selection | Custom readout |
|---|---|---|---|
| React | onActiveChange | onSelect | tooltip={(item, readout) => …} |
| Vue | @active-change | @select | <template #tooltip> |
| Angular | (activeChange) | (select) | <ng-template spTooltip> |
| Reflex | on_active_change | on_select | tooltip=tooltip_template(…) |