Skip to content
Extensões

Venn Diagram

Diagrama de Venn com N circulos SVG sobrepostos, blend modes e tooltip interativo. Suporta de 1 a N areas com posicionamento automatico.

components/venn-diagram.cssAbrir no Figma

Uso

Quando e como utilizar o diagrama de Venn para representar sobreposicao de areas.

  • CSV — Carrega dados de um arquivo CSV via DataLoader com mapeamento de campos.
  • Inline — Dados passados diretamente via JavaScript, sem fetch externo.
  • HTML estatico — SVG escrito manualmente com classes CSS, sem JavaScript.

Exemplos

Veja abaixo os exemplos interativos do diagrama de Venn, incluindo variantes de dados, layouts e configuracoes.

Carregando exemplo...

Anatomia

Estrutura interna do componente e seus elementos.

ParteElementoDescricao
Container.venn-diagramWrapper principal com position relative
Titulo.venn-diagram__titleHeading centralizado, Space Grotesk 18px w600
SVG.venn-diagram__svgSVG responsivo com viewBox dinamico
Circulo.venn-diagram__circleCirculo com fill-opacity 0.55, blend mode e hover
Label.venn-diagram__labelTexto do nome da area, Inter 13px w600
Valor.venn-diagram__valueNumero dentro do circulo, Space Grotesk 18px w700
Tooltip.venn-diagram__tooltipTooltip absoluto com titulo e descricao
Legenda.venn-diagram__legendFlex row centralizada com gap 16px
Legend Item.venn-diagram__legend-itemDot colorido + texto 13px
Vazio.venn-diagram__emptyEstado sem dados, borda dashed e texto sutil

SVG Internals

O posicionamento dos circulos e calculado automaticamente pela funcao calculatePositions(count, size).

QuantidadeAlgoritmoDescricao
1 circuloCentroPosicionado no centro exato do viewBox
2 circulosLado a ladoDeslocados horizontalmente com offset de 60%
3 circulosTrianguloUm no topo, dois na base com offset de 70%
N >= 4CircularDistribuidos em angulos iguais (2*PI/N), partindo do topo

O tamanho do viewBox e configuravel via display.size (padrao 400). O raio de cada circulo e size * 0.22 e o offset de posicionamento e size * 0.14.

Propriedades

Classes CSS disponiveis para estruturar e estilizar o diagrama.

PropriedadeTipoDefaultDescrição
.venn-diagramclasseContainer principal do diagrama.
.venn-diagram__titleclasseTitulo centralizado acima do SVG.
.venn-diagram__svgclasseSVG responsivo (width 100%, height auto).
.venn-diagram__circleclasseCirculo SVG com mix-blend-mode e hover scale.
.venn-diagram__labelclasseTexto label dentro do SVG (text-anchor: middle).
.venn-diagram__valueclasseValor numerico dentro do SVG (font-weight 700).
.venn-diagram__tooltipclasseTooltip posicionado no hover do circulo.
.venn-diagram__tooltip--visibleclasseModificador que torna o tooltip visivel (opacity 1).
.venn-diagram__legendclasseLegenda horizontal abaixo do SVG.
.venn-diagram__legend-itemclasseItem da legenda (dot + nome).
.venn-diagram__legend-dotclasseCirculo colorido 12x12 na legenda.
.venn-diagram__emptyclasseEstado vazio com borda tracejada.

Codigo

Snippets prontos para copiar e usar no seu projeto.

HTML estatico (SVG)

html
<div class="venn-diagram">
  <h3 class="venn-diagram__title">Exemplo Estatico</h3>
  <svg class="venn-diagram__svg" viewBox="0 0 400 400">
    <circle class="venn-diagram__circle" cx="170" cy="160" r="90"
      fill="#FB923C" fill-opacity="0.55"/>
    <circle class="venn-diagram__circle" cx="230" cy="160" r="90"
      fill="#F97316" fill-opacity="0.55"/>
    <circle class="venn-diagram__circle" cx="200" cy="230" r="90"
      fill="#EA580C" fill-opacity="0.55"/>
    <text class="venn-diagram__label" x="170" y="150">Animal</text>
    <text class="venn-diagram__label" x="230" y="150">Vegetal</text>
    <text class="venn-diagram__label" x="200" y="240">Inspecao</text>
  </svg>
</div>

DataLoader + Factory

js
import { DataLoader } from '../core/data-loader.js';
import { renderVennDiagram } from '../components/venn-diagram.js';

const data = await DataLoader.load({
  endpoint: '/data/venn/areas-atuacao.csv'
});

renderVennDiagram(
  document.getElementById('venn-container'),
  data,
  { label: 'label', color: 'color', description: 'descricao', value: 'valor' },
  { title: 'Areas de Atuacao', size: 400, legend: true, showValues: true }
);

Dados inline

js
import { renderVennDiagram } from '../components/venn-diagram.js';

const data = [
  { label: 'Sanidade Animal', color: '#FB923C', descricao: 'Fiscalizacao de rebanhos', valor: 450 },
  { label: 'Sanidade Vegetal', color: '#F97316', descricao: 'Controle de pragas', valor: 320 },
  { label: 'Inspecao', color: '#EA580C', descricao: 'Produtos de origem animal/vegetal', valor: 280 }
];

renderVennDiagram(
  document.getElementById('venn-container'),
  data,
  { label: 'label', color: 'color', description: 'descricao', value: 'valor' },
  { title: 'Triangulo de competencias' }
);

Fonte de Dados

O componente trabalha com o DataLoader e aceita dados em CSV ou JSON.

CSV (formato recomendado)

O DataLoader converte automaticamente o CSV em um array de objetos. Cada linha vira um circulo no diagrama.

csv
label,color,descricao,valor
Sanidade Animal,#FB923C,Fiscalizacao de rebanhos,450
Sanidade Vegetal,#F97316,Controle de pragas,320
Inspecao,#EA580C,Produtos de origem animal/vegetal,280

Mapeamento de campos

CampoChave no mappingPadraoDescricao
Nome da arealabel'label'Texto exibido dentro do circulo
Corcolor'color'Cor hexadecimal do fill
Descricaodescription'descricao'Texto exibido no tooltip
Valorvalue'valor'Numero exibido dentro do circulo

Opcoes de display

OpcaoTipoPadraoDescricao
titlestringTitulo exibido acima do diagrama
sizenumber400Tamanho do viewBox SVG (largura e altura)
legendbooleantrueExibe a legenda abaixo do SVG
showValuesbooleantrueExibe valores numericos dentro dos circulos
emptyTextstring'Nenhum dado encontrado.'Texto do estado vazio

Dark Mode

O diagrama adapta automaticamente ao tema escuro via classe .dark.

A principal diferenca no dark mode e o mix-blend-mode dos circulos:

PropriedadeLightDark
mix-blend-modemultiplyscreen
Tooltip background--surface-base-neutral-container-default--surface-base-neutral-container-default
Tooltip shadowrgba(0,0,0,0.12)rgba(0,0,0,0.32)

No modo claro, multiply escurece as intersecoes entre circulos, criando contraste natural nas areas sobrepostas. No modo escuro, screen clareia as intersecoes, mantendo o mesmo efeito visual sobre fundos escuros.

Design System interno do GALES