Charts · Distributions & comparisons
DivergingBarChart
| question | Strongly disagree | Disagree | Neutral | Agree | Strongly agree |
|---|---|---|---|---|---|
| The site is easy to use | 21.6% | 26.6% | 25.1% | 12.1% | 14.6% |
| Prices are fair | 19.1% | 18.1% | 31.2% | 21.1% | 10.6% |
| Delivery was on time | 20.1% | 21.1% | 22.6% | 15.6% | 20.6% |
| Support solved my issue | 18.6% | 19.6% | 21.6% | 20.6% | 19.6% |
| I would recommend it | 27.6% | 18.1% | 25.1% | 10.1% | 19.1% |
| The app is reliable | 24.6% | 16.6% | 23.1% | 20.1% | 15.6% |
| question | Strongly disagree | Disagree | Neutral | Agree | Strongly agree |
|---|---|---|---|---|---|
| The site is easy to use | 21.6% | 26.6% | 25.1% | 12.1% | 14.6% |
| Prices are fair | 19.1% | 18.1% | 31.2% | 21.1% | 10.6% |
| Delivery was on time | 20.1% | 21.1% | 22.6% | 15.6% | 20.6% |
| Support solved my issue | 18.6% | 19.6% | 21.6% | 20.6% | 19.6% |
| I would recommend it | 27.6% | 18.1% | 25.1% | 10.1% | 19.1% |
| The app is reliable | 24.6% | 16.6% | 23.1% | 20.1% | 15.6% |
| question | Strongly disagree | Disagree | Neutral | Agree | Strongly agree |
|---|---|---|---|---|---|
| The site is easy to use | 21.6% | 26.6% | 25.1% | 12.1% | 14.6% |
| Prices are fair | 19.1% | 18.1% | 31.2% | 21.1% | 10.6% |
| Delivery was on time | 20.1% | 21.1% | 22.6% | 15.6% | 20.6% |
| Support solved my issue | 18.6% | 19.6% | 21.6% | 20.6% | 19.6% |
| I would recommend it | 27.6% | 18.1% | 25.1% | 10.1% | 19.1% |
| The app is reliable | 24.6% | 16.6% | 23.1% | 20.1% | 15.6% |
| question | Strongly disagree | Disagree | Neutral | Agree | Strongly agree |
|---|---|---|---|---|---|
| The site is easy to use | 21.6% | 26.6% | 25.1% | 12.1% | 14.6% |
| Prices are fair | 19.1% | 18.1% | 31.2% | 21.1% | 10.6% |
| Delivery was on time | 20.1% | 21.1% | 22.6% | 15.6% | 20.6% |
| Support solved my issue | 18.6% | 19.6% | 21.6% | 20.6% | 19.6% |
| I would recommend it | 27.6% | 18.1% | 25.1% | 10.1% | 19.1% |
| The app is reliable | 24.6% | 16.6% | 23.1% | 20.1% | 15.6% |
Example
The chart above, in each framework. Pick a framework once and every example on the site follows it. `levels` is required: the level columns, most negative first.
npm install @silverpoint/react @silverpoint/grounds @silverpoint/fontsimport '@silverpoint/fonts/fonts.css';
import '@silverpoint/grounds/styles.css';
import { DivergingBarChart } from '@silverpoint/react/diverging-bar-chart';
const data = [
{ question: 'The site is easy to use', Strongly disagree: 43, Disagree: 53, Neutral: 50, Agree: 24, Strongly agree: 29 },
{ question: 'Prices are fair', Strongly disagree: 38, Disagree: 36, Neutral: 62, Agree: 42, Strongly agree: 21 },
{ question: 'Delivery was on time', Strongly disagree: 40, Disagree: 42, Neutral: 45, Agree: 31, Strongly agree: 41 },
{ question: 'Support solved my issue', Strongly disagree: 37, Disagree: 39, Neutral: 43, Agree: 41, Strongly agree: 39 },
{ question: 'I would recommend it', Strongly disagree: 55, Disagree: 36, Neutral: 50, Agree: 20, Strongly agree: 38 },
{ question: 'The app is reliable', Strongly disagree: 49, Disagree: 33, Neutral: 46, Agree: 40, Strongly agree: 31 },
];
export default function App() {
return (
<div style={{ width: 480 }}>
<DivergingBarChart
data={data}
labelKey="question"
levels={['Strongly disagree', 'Disagree', 'Neutral', 'Agree', 'Strongly agree']}
title="Customer survey"
/>
</div>
);
}npm install @silverpoint/vue @silverpoint/grounds @silverpoint/fonts<script setup lang="ts">
import '@silverpoint/fonts/fonts.css';
import '@silverpoint/grounds/styles.css';
import { SpDivergingBarChart } from '@silverpoint/vue/diverging-bar-chart';
const data = [
{ question: 'The site is easy to use', Strongly disagree: 43, Disagree: 53, Neutral: 50, Agree: 24, Strongly agree: 29 },
{ question: 'Prices are fair', Strongly disagree: 38, Disagree: 36, Neutral: 62, Agree: 42, Strongly agree: 21 },
{ question: 'Delivery was on time', Strongly disagree: 40, Disagree: 42, Neutral: 45, Agree: 31, Strongly agree: 41 },
{ question: 'Support solved my issue', Strongly disagree: 37, Disagree: 39, Neutral: 43, Agree: 41, Strongly agree: 39 },
{ question: 'I would recommend it', Strongly disagree: 55, Disagree: 36, Neutral: 50, Agree: 20, Strongly agree: 38 },
{ question: 'The app is reliable', Strongly disagree: 49, Disagree: 33, Neutral: 46, Agree: 40, Strongly agree: 31 },
];
</script>
<template>
<div style="width: 480px">
<SpDivergingBarChart
:data="data"
label-key="question"
:levels="['Strongly disagree', 'Disagree', 'Neutral', 'Agree', 'Strongly agree']"
title="Customer survey"
/>
</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 { SpDivergingBarChart } from '@silverpoint/angular/diverging-bar-chart';
@Component({
selector: 'app-root',
imports: [SpDivergingBarChart],
template: `
<div style="width: 480px">
<sp-diverging-bar-chart
[data]="data"
labelKey="question"
[levels]="['Strongly disagree', 'Disagree', 'Neutral', 'Agree', 'Strongly agree']"
title="Customer survey"
/>
</div>
`,
})
export class App {
protected readonly data = [
{ question: 'The site is easy to use', Strongly disagree: 43, Disagree: 53, Neutral: 50, Agree: 24, Strongly agree: 29 },
{ question: 'Prices are fair', Strongly disagree: 38, Disagree: 36, Neutral: 62, Agree: 42, Strongly agree: 21 },
{ question: 'Delivery was on time', Strongly disagree: 40, Disagree: 42, Neutral: 45, Agree: 31, Strongly agree: 41 },
{ question: 'Support solved my issue', Strongly disagree: 37, Disagree: 39, Neutral: 43, Agree: 41, Strongly agree: 39 },
{ question: 'I would recommend it', Strongly disagree: 55, Disagree: 36, Neutral: 50, Agree: 20, Strongly agree: 38 },
{ question: 'The app is reliable', Strongly disagree: 49, Disagree: 33, Neutral: 46, Agree: 40, Strongly agree: 31 },
];
}pip install reflex-silverpoint-reactimport reflex as rx
from reflex_silverpoint_react import diverging_bar_chart
DATA = [
{"question": "The site is easy to use", "Strongly disagree": 43, "Disagree": 53, "Neutral": 50, "Agree": 24, "Strongly agree": 29},
{"question": "Prices are fair", "Strongly disagree": 38, "Disagree": 36, "Neutral": 62, "Agree": 42, "Strongly agree": 21},
{"question": "Delivery was on time", "Strongly disagree": 40, "Disagree": 42, "Neutral": 45, "Agree": 31, "Strongly agree": 41},
{"question": "Support solved my issue", "Strongly disagree": 37, "Disagree": 39, "Neutral": 43, "Agree": 41, "Strongly agree": 39},
{"question": "I would recommend it", "Strongly disagree": 55, "Disagree": 36, "Neutral": 50, "Agree": 20, "Strongly agree": 38},
{"question": "The app is reliable", "Strongly disagree": 49, "Disagree": 33, "Neutral": 46, "Agree": 40, "Strongly agree": 31},
]
def index() -> rx.Component:
return rx.box(
diverging_bar_chart(
data=DATA,
label_key="question",
levels=["Strongly disagree", "Disagree", "Neutral", "Agree", "Strongly agree"],
title="Customer survey",
),
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 { DivergingBarChart } from '@silverpoint/react/diverging-bar-chart'; |
| Vue | import { SpDivergingBarChart } from '@silverpoint/vue/diverging-bar-chart'; |
| Angular | import { SpDivergingBarChart } from '@silverpoint/angular/diverging-bar-chart'; // <sp-diverging-bar-chart> |
| Reflex | from reflex_silverpoint_react import diverging_bar_chart |
Props
The props DivergingBarChart 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 |
|---|---|---|---|---|
labelKey | label-key | label_key | Accessor<string> | — |
levels | levels | levels | readonly string[] | The level columns, most negative first. |
neutral | neutral | neutral | number | null | Index of the neutral level, split across the centre; null for none. The middle one by default. |
percent | percent | percent | boolean | Normalises each row to 100 %; 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(…) |