Scatter Chart
Correlação entre um campo X numérico e uma ou mais séries Y, plotada como dots coloridos.
Visão geral
ScatterChart é o wrapper estilizado sobre o ScatterChart do recharts, composto sobre o primitive chart do shadcn (ChartContainer). O xKey é um campo numérico (eixo X linear); cada entrada em config é uma série Y numérica. O gráfico conecta o cartesian grid, os eixos X e Y numéricos, um tooltip opcional e um conjunto de dots por série.
Use ScatterChart quando você precisa revelar correlação, densidade ou outliers - tempo de resposta vs tamanho do payload, taxa de conversão vs tráfego, runtime vs input. Para tendências de categoria ordenada use LineChart ou AreaChart; para comparação de categoria discreta use BarChart.
A edição React (@gremorie/rx-data) renderiza com recharts dentro do primitive chart do shadcn; a edição Angular (@gremorie/ng-data) renderiza geometria d3 headless dentro de um SVG estilizado. O motor de renderização difere; a superfície pública é idêntica input-por-input.
Anatomia
<scatter-chart>
└─ figure (role="img") card surface, aspect-video
├─ svg (chart frame)
│ ├─ cartesian grid
│ ├─ x axis (numeric from xKey)
│ ├─ y axis (numeric, optional via yAxis)
│ └─ points, one set per config key
├─ tooltip overlay (optional via tooltip)
├─ legend (when config has >1 series)
└─ sr-only data tableA edição React compõe esta superfície através do primitive chart do shadcn:
ChartContainer responsive frame + injects --color-<key>
└─ ScatterChart recharts scatter plot area
├─ CartesianGrid full grid
├─ XAxis numeric X (linear)
├─ YAxis numeric Y (linear)
├─ ChartTooltip hover card
│ └─ ChartTooltipContent styled tooltip body
└─ Scatter one set of dots per seriesPreview
| weight | Height (cm) |
|---|---|
| 60 | 165 |
| 72 | 178 |
| 55 | 160 |
| 90 | 185 |
| 68 | 172 |
| 80 | 180 |
'use client';import { ScatterChart, type ChartConfig, type ChartDatum,} from '@gremorie/rx-data';const scatterData: ChartDatum[] = [ { weight: 60, height: 165 }, { weight: 72, height: 178 }, { weight: 55, height: 160 }, { weight: 90, height: 185 }, { weight: 68, height: 172 }, { weight: 80, height: 180 },];const scatterConfig: ChartConfig = { height: { label: 'Height (cm)', color: 'var(--chart-1)' },};export function ScatterChartPreview() { return ( <ScatterChart data={scatterData} config={scatterConfig} xKey="weight" /> );}Instalação
bash npx gremorie@latest add rx-scatter-chart bash pnpm dlx gremorie@latest add rx-scatter-chart
bash yarn dlx gremorie@latest add rx-scatter-chart
bash bunx --bun gremorie@latest add rx-scatter-chart
Uso
import { ScatterChart } from "@gremorie/rx-data";
import type { ChartConfig, ChartDatum } from "@gremorie/rx-data";
const data: ChartDatum[] = [
{ x: 30, y: 100 },
{ x: 50, y: 200 },
{ x: 70, y: 150 },
{ x: 90, y: 250 },
{ x: 110, y: 175 },
{ x: 130, y: 300 },
];
const config: ChartConfig = {
y: { label: "Value", color: "var(--chart-1)" },
};
export function CorrelationChart() {
return <ScatterChart data={data} config={config} xKey="x" />;
}import { Component } from '@angular/core';
import { ScatterChart } from '@gremorie/ng-data';
import type { ChartConfig, ChartDatum } from '@gremorie/ng-data';
@Component({
selector: 'app-correlation-chart',
imports: [ScatterChart],
template: `<scatter-chart [data]="data" [config]="config" xKey="x" />`,
})
export class CorrelationChartComponent {
readonly data: ChartDatum[] = [
{ x: 30, y: 100 },
{ x: 50, y: 200 },
{ x: 70, y: 150 },
{ x: 90, y: 250 },
{ x: 110, y: 175 },
{ x: 130, y: 300 },
];
readonly config: ChartConfig = {
y: { label: 'Value', color: 'var(--chart-1)' },
};
}
API
<ScatterChart>
O wrapper estilizado sobre o ScatterChart do recharts, composto sobre ChartContainer. Renderiza o frame responsivo, um cartesian grid, os eixos X e Y numéricos, um tooltip opcional e um <Scatter> por chave de config colorido com var(--color-<key>).
| Prop | Type | Default | Descrição |
|---|---|---|---|
data | ChartDatum[] | - | Dados tabulares. Cada linha carrega o valor numérico de xKey mais um valor numérico por chave de config. |
config | ChartConfig | - | Mapeia cada chave de série Y para { label, color }. A color é qualquer cor CSS ou token, tipicamente "var(--chart-1)" até "var(--chart-5)". ChartContainer injeta cada uma como uma CSS variable var(--color-<key>). |
xKey | string | - | Nome do campo numérico em cada linha usado como eixo X. Linear, não categórico. |
yAxis | boolean | true | Renderiza o eixo Y numérico. Defina como false para um scatter minimalista, sem eixo. |
tooltip | boolean | true | Alterna o tooltip de hover. |
className | string | - | Mesclado no ChartContainer. |
Compondo com o primitive chart
Para controle total, componha recharts diretamente dentro de ChartContainer usando os primitives exportados. O shadcn não distribui bloco de scatter, mas a composição segue o mesmo padrão dos outros blocos de chart do shadcn.
| Export | Papel |
|---|---|
ChartContainer | Frame responsivo; injeta as vars --color-<key> por série a partir do config. |
ChartTooltip | Reexport do Tooltip do recharts; combine com ChartTooltipContent. |
ChartTooltipContent | Corpo de tooltip estilizado. |
ChartLegend | Reexport do Legend do recharts; combine com ChartLegendContent. |
ChartLegendContent | Corpo de legenda estilizado. |
useChart | Hook para ler o config ativo dentro de um child customizado. |
Types
| Type | Shape |
|---|---|
ChartDatum | Record<string, string | number> & { fill?: string } - uma linha de dados do chart; o fill opcional define uma cor por ponto. |
ChartConfig | Record<string, { label?: ReactNode; color?: string }> - mapa de label e cor por série. |
import {
ChartContainer,
ChartTooltip,
ChartTooltipContent,
type ChartConfig,
type ChartDatum,
} from '@gremorie/rx-data';
import { CartesianGrid, Scatter, ScatterChart, XAxis, YAxis } from 'recharts';
const config = {
y: { label: 'Value', color: 'var(--chart-1)' },
} satisfies ChartConfig;
export function Example({ data }: { data: ChartDatum[] }) {
return (
<ChartContainer config={config}>
<ScatterChart
accessibilityLayer
margin={{ left: 12, right: 12, top: 8, bottom: 8 }}
>
<CartesianGrid />
<XAxis
dataKey="x"
type="number"
name="x"
tickLine={false}
axisLine={false}
tickMargin={8}
/>
<YAxis
type="number"
tickLine={false}
axisLine={false}
tickMargin={8}
width={40}
/>
<ChartTooltip
cursor={{ strokeDasharray: '3 3' }}
content={<ChartTooltipContent />}
/>
<Scatter name="y" dataKey="y" fill="var(--color-y)" />
</ScatterChart>
</ChartContainer>
);
}Desça a este nível para bubble charts (tamanho codificado por um terceiro campo), coloração por ponto via o fill da linha, overlays de jitter ou uma legenda customizada via ChartLegend + ChartLegendContent.
Composição
- O
xKeydeve ser numérico. Ambos os eixos usamtype="number"do recharts, então a escala X é linear, não uma band scale. - Cada entrada de
configse torna um conjunto<Scatter>de dots, colorido por sua variávelvar(--color-<key>). O domínio Y compartilhado auto-inclui todas as séries. - Cor por ponto é possível definindo um campo
fillem linhas individuais deChartDatum; o recharts o lê sobre a cor da série. - Mantenha a contagem de séries baixa - duas ou três antes que os dots fiquem densos demais para ler uns contra os outros.
O chart se auto-dimensiona ao pai através do frame responsivo do ChartContainer.
Variações
Série única
| weight | Height (cm) |
|---|---|
| 60 | 165 |
| 72 | 178 |
| 55 | 160 |
| 90 | 185 |
| 68 | 172 |
| 80 | 180 |
<ScatterChart
data={data}
config={{ y: { label: 'Value', color: 'var(--chart-1)' } }}
xKey="x"
/><scatter-chart [data]="data" [config]="config" xKey="x" />A forma padrão. Use uma série única quando revelar correlação ou densidade entre um par de eixos numéricos.
Multi-série
| weight | Height (cm) | Target (cm) |
|---|---|---|
| 60 | 165 | 170 |
| 72 | 178 | 176 |
| 55 | 160 | 168 |
| 90 | 185 | 184 |
| 68 | 172 | 174 |
| 80 | 180 | 181 |
const config: ChartConfig = {
height: { label: 'Median', color: 'var(--chart-1)' },
max: { label: 'Max', color: 'var(--chart-2)' },
};
<ScatterChart data={data} config={config} xKey="weight" />;<scatter-chart [data]="data" [config]="config" xKey="weight" />Para comparar duas distribuições contra o mesmo eixo X. Os tokens de cor carregam a distinção de série; mantenha a contagem em duas ou três antes que os dots fiquem densos demais para ler.
Sem eixo
Defina yAxis como false para remover o eixo Y numérico e obter um scatter minimalista, sem eixo, que se apoia no tooltip para valores exatos.
<ScatterChart data={data} config={config} xKey="x" yAxis={false} /><scatter-chart [data]="data" [config]="config" xKey="x" [yAxis]="false" />Acessibilidade
- o
accessibilityLayerdo recharts adiciona navegação por teclado e anúncios de screen reader para as séries plotadas. - os tokens
--chart-1até--chart-5vêm com contraste WCAG AA contra o fundo do card em ambos os temas claro e escuro. - Ressalva de densidade: scatter plots densos podem esconder outliers atrás de clusters. Defina um
fillOpacitymais baixo em um<Scatter>customizado ou aplique um leve jitter para manter os pontos individuais legíveis.