Diagrama de Sankey

Visão geral

Um diagrama de Sankey é uma visualização usada para representar um fluxo de um conjunto de valores para outro. Os elementos conectados são chamados de nós e as conexões são chamadas de links. O Sankeys é melhor usado quando você quer mostrar um mapeamento de muitos para muitos entre dois domínios (por exemplo, universidades e grandes empresas) ou vários caminhos em um conjunto de etapas (por exemplo, o Google Analytics usa Sankeys para mostrar como o tráfego flui de páginas para outras páginas no seu site).

Para os curiosos, eles são nomeados em homenagem ao Capitão Sankey, que criou um diagrama de eficiência do motor a vapor que usava setas com larguras proporcionais à perda de calor.

Observação: o diagrama de Sankey pode estar passando por revisões substanciais em futuras versões do Google Charts.

Os diagramas de Sankey são renderizados no navegador usando SVG ou VML, o que for apropriado para o navegador do usuário. O código de layout Sankey do Google é derivado do código de layout Sankey do D3.

Observação:os diagramas de Sankey do Google não estão disponíveis no Microsoft Internet Explorer 8 e em versões anteriores.

Um exemplo simples

Suponha que você tenha duas categorias, A e B, que se conectam a três outras categorias, X, Y e Z. Algumas dessas conexões são mais pesadas do que outras. Por exemplo, B tem uma conexão fina com X e uma conexão muito mais grossa com Y.


Passe o cursor sobre um dos links para destacar a conexão.

Para criar um diagrama de Sankey, forneça um conjunto de linhas, cada uma contendo informações sobre uma conexão: de, para e peso. Em seguida, use o método google.visualization.Sankey() para inicializar o gráfico e, em seguida, o método draw() para renderizá-lo:

<html>
  <head>
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
    <script type="text/javascript">
      google.charts.load('current', {'packages':['sankey']});
      google.charts.setOnLoadCallback(drawChart);

      function drawChart() {
        var data = new google.visualization.DataTable();
        data.addColumn('string', 'From');
        data.addColumn('string', 'To');
        data.addColumn('number', 'Weight');
        data.addRows([
          [ 'A', 'X', 5 ],
          [ 'A', 'Y', 7 ],
          [ 'A', 'Z', 6 ],
          [ 'B', 'X', 2 ],
          [ 'B', 'Y', 9 ],
          [ 'B', 'Z', 4 ]
        ]);

        // Sets chart options.
        var options = {
          width: 600,
        };

        // Instantiates and draws our chart, passing in some options.
        var chart = new google.visualization.Sankey(document.getElementById('sankey_basic'));
        chart.draw(data, options);
      }
    </script>
  </head>
  <body>
    <div id="sankey_basic" style="width: 900px; height: 300px;"></div>
  </body>
</html>

Observação: evite ciclos nos seus dados. Se A estiver vinculada a si mesma ou a B, que está vinculada a C que está vinculada a A, o gráfico não será renderizado.

Sankeys multinível

É possível criar um diagrama de Sankey com vários níveis de conexões:

Os diagramas de Sankey vão adicionar outros níveis conforme necessário, colocando-os automaticamente. Confira o código completo do gráfico acima:

<html>
<body>
 <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>

<div id="sankey_multiple" style="width: 900px; height: 300px;"></div>

<script type="text/javascript">
  google.charts.load("current", {packages:["sankey"]});
  google.charts.setOnLoadCallback(drawChart);
   function drawChart() {
    var data = new google.visualization.DataTable();
    data.addColumn('string', 'From');
    data.addColumn('string', 'To');
    data.addColumn('number', 'Weight');
    data.addRows([
       [ 'Brazil', 'Portugal', 5 ],
       [ 'Brazil', 'France', 1 ],
       [ 'Brazil', 'Spain', 1 ],
       [ 'Brazil', 'England', 1 ],
       [ 'Canada', 'Portugal', 1 ],
       [ 'Canada', 'France', 5 ],
       [ 'Canada', 'England', 1 ],
       [ 'Mexico', 'Portugal', 1 ],
       [ 'Mexico', 'France', 1 ],
       [ 'Mexico', 'Spain', 5 ],
       [ 'Mexico', 'England', 1 ],
       [ 'USA', 'Portugal', 1 ],
       [ 'USA', 'France', 1 ],
       [ 'USA', 'Spain', 1 ],
       [ 'USA', 'England', 5 ],
       [ 'Portugal', 'Angola', 2 ],
       [ 'Portugal', 'Senegal', 1 ],
       [ 'Portugal', 'Morocco', 1 ],
       [ 'Portugal', 'South Africa', 3 ],
       [ 'France', 'Angola', 1 ],
       [ 'France', 'Senegal', 3 ],
       [ 'France', 'Mali', 3 ],
       [ 'France', 'Morocco', 3 ],
       [ 'France', 'South Africa', 1 ],
       [ 'Spain', 'Senegal', 1 ],
       [ 'Spain', 'Morocco', 3 ],
       [ 'Spain', 'South Africa', 1 ],
       [ 'England', 'Angola', 1 ],
       [ 'England', 'Senegal', 1 ],
       [ 'England', 'Morocco', 2 ],
       [ 'England', 'South Africa', 7 ],
       [ 'South Africa', 'China', 5 ],
       [ 'South Africa', 'India', 1 ],
       [ 'South Africa', 'Japan', 3 ],
       [ 'Angola', 'China', 5 ],
       [ 'Angola', 'India', 1 ],
       [ 'Angola', 'Japan', 3 ],
       [ 'Senegal', 'China', 5 ],
       [ 'Senegal', 'India', 1 ],
       [ 'Senegal', 'Japan', 3 ],
       [ 'Mali', 'China', 5 ],
       [ 'Mali', 'India', 1 ],
       [ 'Mali', 'Japan', 3 ],
       [ 'Morocco', 'China', 5 ],
       [ 'Morocco', 'India', 1 ],
       [ 'Morocco', 'Japan', 3 ]
    ]);

    // Set chart options
    var options = {
      width: 600,
    };

    // Instantiate and draw our chart, passing in some options.
    var chart = new google.visualization.Sankey(document.getElementById('sankey_multiple'));
    chart.draw(data, options);
   }
</script>
</body>
</html>

Controlar cores

Os diagramas de Sankey podem definir cores personalizadas para nós e links. Os nós e os links podem receber paletas de cores personalizadas usando as opções de colors (sankey.node.colors e sankey.link.colors, respectivamente). Eles também podem receber diferentes modos de coloração usando a opção colorMode.

Se as cores não forem personalizadas, o padrão será a paleta do Material Design padrão.

    var colors = ['#a6cee3', '#b2df8a', '#fb9a99', '#fdbf6f',
                  '#cab2d6', '#ffff99', '#1f78b4', '#33a02c'];

    var options = {
      height: 400,
      sankey: {
        node: {
          colors: colors
        },
        link: {
          colorMode: 'gradient',
          colors: colors
        }
      }
    };

Você pode controlar as cores dos links, nós e rótulos com as opções de configuração. Aqui, selecionamos três com a mesma matiz, mas brilhos diferentes:

Veja como são essas opções:

    var options = {
      width: 600,
      sankey: {
        link: { color: { fill: '#d799ae' } },
        node: { colors: [ '#a61d4c' ],
                label: { color: '#871b47' } },
      }
    };

Também é possível controlar a transparência dos links com a opção sankey.link.color.fillOpacity:

    var options = {
      width: 600,
      sankey: {
        link: { color: { fill: '#d799ae', fillOpacity: 0.8 } },
        node: { colors: [ '#a61d4c' ],
                label: { color: '#871b47' } },
      }
    };

Para criar uma borda ao redor dos links, use as opções sankey.link.color.stroke e sankey.link.color.strokeWidth:

A cor do traço pode ser especificada no formato RGB ou pelo nome em inglês.

    var options = {
      width: 750,
      height: 400,
      sankey: {
        node: { colors: [ '#a61d4c' ] },
        link: { color: { stroke: 'black', strokeWidth: 1 } },
      }
    };

Personalizar rótulos

O texto em diagramas de Sankey pode ser personalizado usando sankey.node.label.fontName e amigos:

Esta é a estrofe de opção para o gráfico acima:

    var options = {
      width: 600,
      sankey: {
        node: { label: { fontName: 'Times-Roman',
                         fontSize: 14,
                         color: '#871b47',
                         bold: true,
                         italic: true } } },
    };

É possível ajustar a posição dos rótulos em relação aos nós com a opção sankey.node.labelPadding:

No gráfico acima, adicionamos 30 pixels de preenchimento entre os rótulos e os nós.

    var options = {
      width: 600,
      sankey: { node: { labelPadding: 30 } },
    };

Como ajustar nós

É possível controlar a largura dos nós com sankey.node.width:

Acima, definimos a largura do nó como 2.

    var options = {
      width: 600,
      sankey: { node: { width: 2 } },
    };

É possível ajustar a distância entre os nós com sankey.node.nodePadding:

No gráfico acima, definimos sankey.node.nodePadding como 80.

    var options = {
      width: 900,
      sankey: { node: { nodePadding: 80 } },
    };

Carregando

O nome do pacote google.charts.load é "sankey":

  google.charts.load("current" {packages: ["sankey"]});

O nome da classe da visualização é google.visualization.Sankey:

  var visualization = new google.visualization.Sankey(container);

Formato de dados

Linhas: cada linha na tabela representa uma conexão entre dois rótulos. A terceira coluna indica a intensidade dessa conexão e será refletida na largura do caminho entre os rótulos.

Columns:

  Coluna 0 Coluna 1 Coluna 2 ... Coluna N (opcional)
Finalidade: Fonte Destino Valor ... Papéis opcionais
Tipo de dados: string string number ...
Role: domínio domínio dados ...
Papéis de coluna opcionais:

Nenhum controle

Nenhum controle

Nenhum controle

...

 

Opções de configuração

Nome
forceIFrame

Desenha o gráfico dentro de um frame inline. No IE8, essa opção é ignorada. Todos os gráficos do IE8 são desenhados em i-frames.

Tipo: booleano
Padrão:false
height

Altura do gráfico, em pixels.

Tipo: número
Padrão:altura do elemento contêiner
sankey.iterations

Com Sankey multinível, às vezes, não é óbvio onde os nós precisam ser colocados para melhor legibilidade. Os experimentos do mecanismo de layout D3 com diferentes layouts de nó são interrompidos quando sankey.iterations tentativas são feitas. Quanto maior for esse número, mais agradável será o layout de diagramas de Sankey complexos, mas isso tem um custo: os Sankeys demorarão mais para renderizar. Por outro lado, quanto menor for esse número, mais rápido os gráficos serão renderizados.

Tipo: inteiro
Padrão:32
sankey.link

Controla os atributos das conexões entre os nós. Atualmente, todos os atributos pertencem a cor:

sankey: {
  link: {
    color: {
      fill: '#efd',     // Color of the link.
      fillOpacity: 0.8, // Transparency of the link.
      stroke: 'black',  // Color of the link border.
      strokeWidth: 1    // Thickness of the link border (default 0).
    },
    colors: [
      '#a6cee3',        // Custom color palette for sankey links.
      '#1f78b4',        // Nodes will cycle through this palette
      '#b2df8a',        // giving the links for that node the color.
      '#33a02c'
    ]
  }
}
      
Tipo: objeto
Padrão:nulo
sankey.link.colorMode

Define um modo de coloração para os vínculos entre os nós. Valores possíveis:

  • 'source': a cor do nó de origem é usada para os links de todos os nós de destino.
  • 'target': a cor do nó de destino é usada para o link com os nós de origem.
  • 'gradient': o vínculo entre um nó de origem e um de destino é colorido como um gradiente da cor do nó de origem à cor do nó de destino.
  • 'none': a opção padrão. As cores dos links serão definidas como padrão (ou uma cor conforme especificado pelas opções sankey.link.color.fill e sankey.link.color.fillOpacity).

Essa opção substitui sankey.link.color.

Tipo: string
Padrão: 'none'
sankey.node

Controla os atributos dos nós (as barras verticais entre os links):

sankey: {
  node: {
    label: {
      fontName: 'Times-Roman',
      fontSize: 12,
      color: '#000',
      bold: true,
      italic: false
    },
    interactivity: true, // Allows you to select nodes.
    labelPadding: 6,     // Horizontal distance between the label and the node.
    nodePadding: 10,     // Vertical distance between nodes.
    width: 5,            // Thickness of the node.
    colors: [
      '#a6cee3',         // Custom color palette for sankey nodes.
      '#1f78b4',         // Nodes will cycle through this palette
      '#b2df8a',         // giving each node its own color.
      '#33a02c'
    ]
  }
}
      
Tipo: objeto
Padrão:nulo
sankey.node.colorMode

Define um modo de coloração para os nós Sankey. Valores possíveis:

  • 'unique': cada nó receberá uma cor exclusiva.
Tipo: string
Padrão: 'unique'
dica

Um objeto com membros para configurar vários elementos de dica. Para especificar as propriedades desse objeto, use a notação literal de objeto, como mostrado aqui:

{textStyle: {color: '#FF0000'}, showColorCode: true}
Tipo: objeto
Padrão:nulo
tooltip.isHtml

Se definida como verdadeira, use dicas renderizadas em HTML (em vez de renderizadas em SVG). Consulte Como personalizar o conteúdo da dica para mais detalhes.

Observação:a personalização do conteúdo da dica HTML pelo papel de dados da coluna de dicas não é compatível com a visualização do gráfico de bolhas.

Tipo: booleano
Padrão:false
tooltip.textStyle

Um objeto que especifica o estilo do texto da dica. O objeto tem este formato:

{ color: <string>,
  fontName: <string>,
  fontSize: <number>,
  bold: <boolean>,
  italic: <boolean> }
    

O color pode ser qualquer string de cor HTML, como 'red' ou '#00cc00'. Consulte também fontName e fontSize.

Tipo: objeto
Padrão: {color: 'black', fontName: <global-font-name>, fontSize: <global-font-size>}
width

Largura do gráfico, em pixels.

Tipo: número
Padrão:largura do elemento que o contém

Métodos

Método
draw(data, options)

Desenha o gráfico. O gráfico aceita outras chamadas de método somente depois que o evento ready é disparado. Extended description.

Return Type: nenhum
getBoundingBox(id)

Retorna um objeto que contém as informações de esquerda, parte superior, largura e altura do elemento id do gráfico. O formato de id ainda não está documentado (eles são os valores de retorno dos manipuladores de eventos), mas estes são alguns exemplos:

var cli = chart.getChartLayoutInterface();

Altura da área do gráfico
cli.getBoundingBox('chartarea').height
Largura da terceira barra na primeira série de um gráfico de barras ou colunas
cli.getBoundingBox('bar#0#2').width
Caixa delimitadora do quinto encaixe de um gráfico de pizza
cli.getBoundingBox('slice#4')
Caixa delimitadora dos dados de um gráfico vertical (por exemplo, coluna):
cli.getBoundingBox('vAxis#0#gridline')
Caixa delimitadora dos dados de um gráfico horizontal (por exemplo, de barras):
cli.getBoundingBox('hAxis#0#gridline')

Os valores são relativos ao contêiner do gráfico. Chame essa função depois que o gráfico for desenhado.

Tipo de retorno: objeto
getSelection()

Retorna uma matriz das entidades de gráfico selecionadas. As entidades selecionáveis são barras, entradas de legenda e categorias. Neste gráfico, apenas uma entidade pode ser selecionada por vez. Extended description .

Tipo de retorno:matriz de elementos de seleção
setSelection()

Seleciona as entidades de gráfico especificadas. Cancela qualquer seleção anterior. As entidades selecionáveis são barras, entradas de legenda e categorias. Neste gráfico, apenas uma entidade pode ser selecionada por vez. Extended description .

Return Type: nenhum
clearChart()

Limpa o gráfico e libera todos os recursos alocados.

Return Type: nenhum

Eventos

Nome
error

Disparado quando ocorre um erro ao tentar renderizar o gráfico.

Properties:ID, message
onmouseover

Disparado quando o usuário passa o mouse sobre uma entidade visual. Transmite os índices de linha e coluna do elemento da tabela de dados correspondente. Uma barra correlaciona-se a uma célula na tabela de dados, uma entrada de legenda para uma coluna (o índice de linha é nulo) e uma categoria a uma linha (o índice da coluna é nulo).

Propriedades: linha, coluna
onmouseout

Disparado quando o usuário afasta o mouse de uma entidade visual. Transmite os índices de linha e coluna do elemento da tabela de dados correspondente. Uma barra correlaciona-se a uma célula na tabela de dados, uma entrada de legenda para uma coluna (o índice de linha é nulo) e uma categoria a uma linha (o índice da coluna é nulo).

Propriedades: linha, coluna
ready

O gráfico está pronto para chamadas de métodos externos. Se você quiser interagir com o gráfico e chamar métodos depois de desenhá-lo, configure um listener para esse evento antes de chamar o método draw e chame-o somente depois que o evento for disparado.

Properties:nenhuma
select

Disparado quando o usuário clica em uma entidade visual. Para saber o que foi selecionado, chame getSelection().

Properties:nenhuma

Política de dados

Todos os códigos e dados são processados e renderizados no navegador. Nenhum dado é enviado para nenhum servidor.