Chart
Gráficos em SVG sem dependências, mais de vinte tipos a partir de um objeto de opções, com tooltips, legendas, zoom e grupos sincronizados, legíveis pelo teclado.
Importação
import { Chart } from '@vitral/vue';Deciding which chart to use is a job for the eye, not for a list of names: every kind on one page, live, with what each one is for and the options behind it.
Lines
Dois eixos y, cada um medindo a sua série; uma segunda linha tracejada, com marcadores. Chegue à área de plotagem com Tab e use as setas.
Stacked area
As áreas se empilham, com preenchimento em gradiente; os rótulos dos eixos usam o preset compacto, e o tooltip, um template próprio. Clique num item da legenda para ocultar uma série.
Bars and columns
Os mesmos dados agrupados, empilhados (com totais), empilhados até 100% e na horizontal. Só a ponta que cresce de uma barra é arredondada.
Lollipop
Barras com a maior parte da tinta removida, para muitas categorias com pequenas diferenças.
Scatter and bubbles
Um eixo x numérico, arrastar para dar zoom nos dois eixos (numa tela de toque, pare e depois arraste) e uma anotação em y. As bolhas mapeiam o valor para a área, não para o raio.
Heat map
Uma cor em cinco passos: “mais da mesma cor” dispensa legenda.
Waterfall
Barras que flutuam: cada uma começa onde o total acumulado parou, então o gráfico mostra como um número foi de um total a outro. `plotOptions.waterfall.totals` indica as colunas que voltam a zero.
Range bar and range area
Um ponto `[low, high]` em vez de um único número: a barra vai de um ao outro, e a área preenche o espaço entre eles. Uma linha ao lado da faixa é uma segunda série.
Histogram and box plot
Duas maneiras de mostrar uma dispersão. O histograma recebe as leituras brutas e as agrupa em faixas por conta própria; o box plot recebe os cinco números — mínimo, quartis, mediana, máximo — por categoria.
Funnel
Etapas de um processo, cada uma tão larga quanto a sua fatia da primeira, para que a queda se leia como uma rampa. `{percent}` está no formatador do rótulo porque é a fatia que se procura num funil.
Stream
Uma área empilhada flutuando sobre uma linha de base própria: as camadas dividem o movimento, em vez de a de baixo carregá-lo sozinha. `plotOptions.stream.offset` escolhe como.
Bullet
Uma medida, a sua meta e as faixas em que ela cai — o trabalho de um medidor numa tira que cabe numa linha de tabela. O traço é a meta que o ponto carrega.
Treemap and sunburst
Duas maneiras de desenhar uma hierarquia. O treemap a encaixa em caixas cujas áreas são os valores; o sunburst a dispõe em anéis, um nível por anel, para que cada fatia fique junto da sua família.
Uma árvore de qualquer profundidade
Um ponto que indica um `parent` monta a árvore por conta própria, em vez dos dois níveis que uma lista de séries dá.
Radial bars and a gauge
Anéis lidos contra as próprias trilhas, e um número contra o seu máximo, com a leitura no meio. `plotOptions.radialBar.min` e `max` definem o que significa um anel completo.
Calendar
Um ano de dias como uma grade de semanas. Uma linha de 365 pontos mostra a tendência; isto mostra o dia.
Gráficos sincronizados, trading
Um preço e o seu volume num só grupo: compartilham a mira, o tooltip e o zoom. Arraste sobre qualquer um para dar zoom nos dois; Shift e arrastar desloca. Inicie o feed e o último candle passa a ser o que ainda está sendo negociado — o fechamento se move a cada tick, a máxima e a mínima só se alargam —, e as três linhas da sessão, lidas desse candle, andam com ele. Como os dados são interpolados em vez de substituídos, um tick é um movimento, e não um salto.
Brush
A faixa de baixo é um brush: arraste a janela dele, ou arraste uma nova, e o gráfico de cima acompanha, reescalando o eixo y ao que mostra.
Pie and donut
O centro mostra o total, ou a fatia em foco; um clique (ou Enter) destaca uma fatia.
Radar
Uma teia de linhas finas para comparar dois perfis, e faixas sombreadas para um só.
Sparklines
`chart.sparkline.enabled`: só as marcas, para um bloco de estatística.
Opções são dados
Edite o JSON: cada opção aqui é um dado simples, que é o que um editor visual vai escrever. Estreite a janela para menos de 520px e a entrada responsiva deita as barras.
Tooltip personalizado e sem dados
O slot do tooltip substitui a leitura; um gráfico sem nada para desenhar diz isso.
Números novos chegam se movendo
Aperte o botão. As barras viajam até as novas alturas em vez de simplesmente aparecerem nelas, então dá para ver para que lado cada uma foi — os valores são interpolados e a imagem é redesenhada a cada quadro, e é por isso que linhas, áreas e fatias também se movem. `chart.animations.dynamicAnimation` define o ritmo ou desliga a animação, e uma mudança que adiciona ou remove uma série simplesmente desenha, já que não há por onde se mover.
Como um gráfico se move
`chart.animations` define a forma do movimento e se as séries chegam juntas ou uma atrás da outra. A mesma curva de easing conduz o primeiro desenho e todas as mudanças depois dele, então um gráfico se move de um jeito só. Nada disso roda para quem tem o sistema pedindo movimento reduzido.
A legenda como leitura
`legend.value` põe um número ao lado do nome de cada série — o total, onde terminou, o maior ou o menor valor —, então a pergunta que costuma vir ao lado de uma legenda é respondida nela. Esta mostra a última leitura de cada linha.
Faixas atrás das marcas
Anotações com `fillColor` sombreiam um intervalo em vez de desenhar uma linha: duas faixas em y dizendo o que conta como calmo e como movimentado, e uma faixa em x sobre os meses em que uma campanha rodou. `position: 'back'` as coloca por baixo dos dados, onde fica um fundo.
A coluna inteira, ou só o que está sob o ponteiro
À esquerda, o tooltip é compartilhado: lista todas as séries na categoria e destaca a que está sendo apontada, para que o painel responda tanto “como estas se comparam” quanto “onde estou”. À direita, `tooltip.intersect` pede uma única leitura, que aparece quando o ponteiro está de fato sobre uma barra.
Usando o gráfico sem framework
O gráfico é o @vitral/chart, que não tem framework nenhum dentro; <Chart> é uma camada fina em volta dele. createChart(element, { type, series, options }) desenha em qualquer elemento e devolve um handle: update, on, zoomX, exportSvg, destroy. Este aqui é montado numa <div> simples pelo módulo abaixo.
API
Lido de packages/vue/src/components/Chart/types.ts, então diz o que o componente aceita de fato.
Props
| Nome | Tipo | Descrição |
|---|---|---|
| type | ChartKind | O tipo de gráfico; sobrepõe `options.chart.type`. O padrão é `'line'`. |
| series | Series | Os dados, em qualquer formato que o ApexCharts aceite: `[{ name, data: [...] }]`, ou números simples para uma pizza. |
| options | Options | Opções no formato do ApexCharts. Tudo o que é visual é dado simples, então o objeto sobrevive ao JSON. |
| height | number | string | Sobrepõe `options.chart.height`: pixels, ou um comprimento CSS. |
| width | number | string | Sobrepõe `options.chart.width`. |
Mais pt, dt e unstyled de BaseProps; veja pass-through e modo sem estilo.
Emits
| Evento | Payload | Descrição |
|---|---|---|
| dataPointSelection | event: ChartPointEvent | Um ponto de dados foi escolhido por clique, Enter ou Espaço. |
| dataPointMouseEnter | event: ChartPointEvent | — |
| dataPointMouseLeave | event: ChartPointEvent | — |
| legendClick | event: { seriesIndex: number; seriesName: string; hidden: boolean } | Uma entrada da legenda foi pressionada; `hidden` é o novo estado da série. |
| zoomed | event: { min: number; max: number } | null | A janela do eixo x mudou; null quando o zoom está todo afastado. |
| selection | event: { min: number; max: number } | Um intervalo foi escolhido no modo de seleção (ou num brush). |
| click | event: { seriesIndex: number; dataPointIndex: number; column: number; originalEvent: MouseEvent } | Qualquer clique na área do gráfico. |
Slots
| Nome | Props do slot | Descrição |
|---|---|---|
| default | — | As partes, escritas como filhos: `<Chart.Tooltip>`, `<Chart.Legend>`… |
| tooltip | (props: ChartTooltipSlotProps) | Substitui o conteúdo do tooltip. |
| noData | — | Mostrado no lugar do gráfico quando não há dados. |
| legend | (props: { name: string; seriesIndex: number; hidden: boolean; color: string }) | Substitui o texto de uma entrada da legenda. |
| center | (props: { name: string; value: string; total: string }) | Substitui o texto central de uma rosca. |