VegaChart

Panoramica

VegaChart è una delle tante possibili visualizzazioni che possono essere create utilizzando la grammatica di visualizzazione Vega, un linguaggio dichiarativo per creare, salvare e condividere progetti di visualizzazione interattivi. Con Vega puoi descrivere l'aspetto visivo e il comportamento interattivo di una visualizzazione in formato JSON e generare viste basate sul Web tramite Canvas o SVG.

Quando disegni un VegaChart, devi includere all'interno delle opzioni una specifica su come creare il grafico nella grammatica di visualizzazione Vega. Alcuni esempi di tali specifiche sono riportati di seguito, mentre altri sono disponibili alla pagina Esempi di VegaChart.

Nota: sebbene la VegaChart di Google Tables possa disegnare qualsiasi grafico Vega che puoi specificare con una specifica JSON Vega (inclusi tutti i contenuti nella Galleria di esempio), non sono ancora disponibili funzionalità aggiuntive che richiedono chiamate all'API Vega.

Un semplice esempio: il grafico a barre

Di seguito è riportato un semplice esempio di grafico Vega che disegna un grafico a barre. Consulta l'esempio originale, un tutorial dettagliato e il grafico a barre nell'editor di grafici Vega.

Sebbene questo sia un altro modo per produrre un grafico a barre in Google Tables, prevediamo di integrare tutte le funzionalità degli altri grafici a barre e a colonne in una nuova implementazione basata su questo VegaChart.

In questo esempio, tieni presente che l'opzione "Dati" è sostituita dalla seguente, che usa "tabella dati" fornita dalla chiamata di disegno come "origine" per un altro oggetto dati chiamato "tabella", mentre "tabella" è usata nel resto delle specifiche Vega.

  'data': [{'name': 'table', 'source': 'datatable'}],

<html>
  <head>
    <script src='https://www.gstatic.com/charts/loader.js'></script>
    <script>
      google.charts.load('upcoming', {'packages': ['vegachart']}).then(drawChart);

      function drawChart() {
        const dataTable = new google.visualization.DataTable();
        dataTable.addColumn({type: 'string', 'id': 'category'});
        dataTable.addColumn({type: 'number', 'id': 'amount'});
        dataTable.addRows([
          ['A', 28],
          ['B', 55],
          ['C', 43],
          ['D', 91],
          ['E', 81],
          ['F', 53],
          ['G', 19],
          ['H', 87],
        ]);

        const options = {
          "vega": {
            "$schema": "https://vega.github.io/schema/vega/v4.json",
            "width": 500,
            "height": 200,
            "padding": 5,

            'data': [{'name': 'table', 'source': 'datatable'}],

            "signals": [
              {
                "name": "tooltip",
                "value": {},
                "on": [
                  {"events": "rect:mouseover", "update": "datum"},
                  {"events": "rect:mouseout",  "update": "{}"}
                ]
              }
            ],

            "scales": [
              {
                "name": "xscale",
                "type": "band",
                "domain": {"data": "table", "field": "category"},
                "range": "width",
                "padding": 0.05,
                "round": true
              },
              {
                "name": "yscale",
                "domain": {"data": "table", "field": "amount"},
                "nice": true,
                "range": "height"
              }
            ],

            "axes": [
              { "orient": "bottom", "scale": "xscale" },
              { "orient": "left", "scale": "yscale" }
            ],

            "marks": [
              {
                "type": "rect",
                "from": {"data":"table"},
                "encode": {
                  "enter": {
                    "x": {"scale": "xscale", "field": "category"},
                    "width": {"scale": "xscale", "band": 1},
                    "y": {"scale": "yscale", "field": "amount"},
                    "y2": {"scale": "yscale", "value": 0}
                  },
                  "update": {
                    "fill": {"value": "steelblue"}
                  },
                  "hover": {
                    "fill": {"value": "red"}
                  }
                }
              },
              {
                "type": "text",
                "encode": {
                  "enter": {
                    "align": {"value": "center"},
                    "baseline": {"value": "bottom"},
                    "fill": {"value": "#333"}
                  },
                  "update": {
                    "x": {"scale": "xscale", "signal": "tooltip.category", "band": 0.5},
                    "y": {"scale": "yscale", "signal": "tooltip.amount", "offset": -2},
                    "text": {"signal": "tooltip.amount"},
                    "fillOpacity": [
                      {"test": "datum === tooltip", "value": 0},
                      {"value": 1}
                    ]
                  }
                }
              }
            ]
          }
        };

        const chart = new google.visualization.VegaChart(document.getElementById('chart-div'));
        chart.draw(dataTable, options);
      }
    </script>
  </head>

  <body>
    <div id="chart-div" style="width: 700px; height: 250px;"></div>
  </body>

</html>


Caricamento

Il nome del pacchetto google.charts.load è "vegachart".

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

Il nome della classe della visualizzazione è google.visualization.VegaChart.

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

Formato dei dati

I dati possono essere trasmessi a un VegaChart in modo molto simile a quello di altri grafici di Google utilizzando una tabella dati (o DataView). La differenza principale è che, invece di basarsi sull'ordine delle colonne per determinare come vengono utilizzate, VegaChart si basa sull'ID di ogni colonna che corrisponde a quanto previsto per la specifica visualizzazione Vega che hai specificato. Ad esempio, la seguente DataTable viene creata con colonne che hanno ID per 'category' e 'amount' e gli stessi ID vengono utilizzati nell'opzione "vega" per fare riferimento a queste colonne.

Con DataTable
        const dataTable = new google.visualization.DataTable();
        dataTable.addColumn({type: 'string', 'id': 'category'});
        dataTable.addColumn({type: 'number', 'id': 'amount'});
        dataTable.addRows([
          ['A', 28],
          ['B', 55],
          ['C', 43],
        ]);

        const options = {
          'vega': {
            ...
            // Here we create the Vega data object named 'datatable',
            // which will be passed in via the draw() call with a DataTable.
            'data': {'name': 'datatable'},

            'scales': [
              {
                'name': 'yscale',
                // Here is an example of how to use the 'amount' field from 'datatable'.
                'domain': {'data': 'datatable', 'field': 'amount'},
              }
            ]
          }
        };

        const chart = new google.visualization.VegaChart(
          document.getElementById('chart-div'));
        chart.draw(dataTable, options);
    
Con dati incorporati in Vega
        // A DataTable is required, but it may be empty.
        const dataTable = new google.visualization.DataTable();
        const options = {
          'vega': {
            // Here the data is specified inline in the Vega specification.
            "data": [
              {
               "name": "table",
                "values": [
                  {"category": "A", "amount": 28},
                  {"category": "B", "amount": 55},
                  {"category": "C", "amount": 43},
                ]
              }
            ],

            'scales': [
              {
                'name': 'yscale',
                // Here is how Vega normally uses the 'amount' field from 'table'.
                "domain": {"data": "table", "field": "category"},
              }
            ]
          }
        };

        const chart = new google.visualization.VegaChart(
          document.getElementById('chart-div'));
        chart.draw(dataTable, options);
    

Tuttavia, solo una di queste tabelle dati può essere trasferita a VegaChart in questo modo, mentre alcuni grafici Vega richiedono più di una tabella di dati. Affronteremo questo limite in una release futura di Google grafici.

Nel frattempo, puoi specificare eventuali dati aggiuntivi da utilizzare nell'opzione 'vega' 'data', integrandoli o caricandoli da un URL. Di seguito sono riportati alcuni esempi.

Opzioni di configurazione

Nome
area grafico

Un oggetto con membri per configurare il posizionamento e le dimensioni dell'area del grafico (dove viene tracciato il grafico stesso, escludendo l'asse e le legende). Sono supportati due formati: un numero o un seguito da %. Un numero semplice è un valore in pixel; un numero seguito da % è una percentuale. Esempio: chartArea:{left:20,top:0,width:'50%',height:'75%'}

Tipo: oggetto
Predefinito: null
chartArea.bottom

Quanto dista il grafico dal bordo inferiore.

Tipo: numero o stringa
Predefinito: automatica
chartArea.left

La distanza desiderata dal bordo sinistro.

Tipo: numero o stringa
Predefinito: automatica
graficoArea.destra

La distanza dal disegno dal bordo destro.

Tipo: numero o stringa
Predefinito: automatica
chartArea.top

La distanza da cui tracciare il grafico dal bordo superiore.

Tipo: numero o stringa
Predefinito: automatica
graficoarea.larghezza

Larghezza area grafico.

Tipo: numero o stringa
Predefinito: automatica
graficoArea.altezza

Altezza area grafico.

Tipo: numero o stringa
Predefinito: automatica
height

Altezza del grafico in pixel.

Tipo: numero
Predefinito: altezza dell'elemento contenitore
width

La larghezza del grafico in pixel.

Tipo: numero
Predefinito: larghezza dell'elemento che la contiene

Metodi

Metodo
draw(data, options)

Disegna il grafico. Il grafico accetta ulteriori chiamate ai metodi solo dopo l'attivazione dell'evento ready. Extended description.

Tipo di reso: nessuno
getAction(actionID)

Restituisce l'oggetto azione della descrizione comando con il actionID richiesto.

Tipo di reso: oggetto
getBoundingBox(id)

Restituisce un oggetto contenente i valori sinistro, superiore, larghezza e altezza dell'elemento del grafico id. Il formato per id non è ancora documentato (sono i valori di ritorno dei gestori di eventi), ma ecco alcuni esempi:

var cli = chart.getChartLayoutInterface();

Altezza dell'area del grafico
cli.getBoundingBox('chartarea').height
Larghezza della terza barra nella prima serie di un grafico a barre o a colonne
cli.getBoundingBox('bar#0#2').width
Riquadro di delimitazione del quinto cuneo di un grafico a torta
cli.getBoundingBox('slice#4')
Casella di delimitazione dei dati di un grafico verticale (ad es. a colonne):
cli.getBoundingBox('vAxis#0#gridline')
Riquadro di delimitazione dei dati del grafico orizzontale (ad es. a barre):
cli.getBoundingBox('hAxis#0#gridline')

I valori sono relativi al contenitore del grafico. Chiamalo dopo il disegno del grafico.

Tipo di reso: oggetto
getChartAreaBoundingBox()

Restituisce un oggetto contenente il lato sinistro, superiore, la larghezza e l'altezza dei contenuti del grafico (escluse le etichette e la legenda):

var cli = chart.getChartLayoutInterface();

cli.getChartAreaBoundingBox().left
cli.getChartAreaBoundingBox().top
cli.getChartAreaBoundingBox().height
cli.getChartAreaBoundingBox().width

I valori sono relativi al contenitore del grafico. Chiamalo dopo il disegno del grafico.

Tipo di reso: oggetto
getChartLayoutInterface()

Restituisce un oggetto contenente informazioni sul posizionamento sullo schermo del grafico e sui suoi elementi.

Nell'oggetto restituito possono essere richiamati i metodi seguenti:

  • getBoundingBox
  • getChartAreaBoundingBox
  • getHAxisValue
  • getVAxisValue
  • getXLocation
  • getYLocation

Chiamalo dopo il disegno del grafico.

Tipo di reso: oggetto
getHAxisValue(xPosition, optional_axis_index)

Restituisce il valore dei dati orizzontali a xPosition, che è un offset di pixel dal bordo sinistro del container del grafico. Può essere negativo.

Esempio: chart.getChartLayoutInterface().getHAxisValue(400).

Chiamalo dopo il disegno del grafico.

Tipo di reso: numero
getImageURI()

Restituisce il grafico serializzato come URI immagine.

Chiamalo dopo il disegno del grafico.

Consulta la sezione Stampa di grafici PNG.

Tipo di reso: stringa
getSelection()

Restituisce una matrice delle entità del grafico selezionate. Per questo grafico è possibile selezionare una sola entità alla volta. Extended description.

Tipo di reso: array di elementi di selezione
getVAxisValue(yPosition, optional_axis_index)

Restituisce il valore dei dati verticali in yPosition, che è un offset di pixel verso il basso dal bordo superiore del contenitore del grafico. Può essere negativo.

Esempio: chart.getChartLayoutInterface().getVAxisValue(300).

Chiamalo dopo il disegno del grafico.

Tipo di reso: numero
getXLocation(dataValue, optional_axis_index)

Restituisce la coordinata x di pixel di dataValue relativa al bordo sinistro del container del grafico.

Esempio: chart.getChartLayoutInterface().getXLocation(400).

Chiamalo dopo il disegno del grafico.

Tipo di reso: numero
getYLocation(dataValue, optional_axis_index)

Restituisce la coordinata y di pixel dataValue rispetto al bordo superiore del contenitore del grafico.

Esempio: chart.getChartLayoutInterface().getYLocation(300).

Chiamalo dopo il disegno del grafico.

Tipo di reso: numero
removeAction(actionID)

Rimuove dal grafico l'azione della descrizione comando con il actionID richiesto.

Tipo di reso: none
setAction(action)

Imposta un'azione della descrizione comando da eseguire quando l'utente fa clic sul testo dell'azione.

Il metodo setAction accetta un oggetto come parametro di azione. Questo oggetto deve specificare tre proprietà: id (l'ID dell'azione da impostare), text (il testo che dovrebbe essere visualizzato nella descrizione comando per l'azione) e action, la funzione che deve essere eseguita quando un utente fa clic sul testo dell'azione.

Tutte le azioni relative alla descrizione comando devono essere impostate prima di chiamare il metodo draw() del grafico. Descrizione estesa.

Tipo di reso: none
setSelection()

Seleziona le entità del grafico specificate. Annulla qualsiasi selezione precedente. Per questo grafico è possibile selezionare una sola entità alla volta. Extended description.

Tipo di reso: nessuno
clearChart()

Cancella il grafico e rilascia tutte le risorse allocate.

Tipo di reso: nessuno

Eventi

Per saperne di più su come utilizzare questi eventi, consulta Interattività di base, Gestione degli eventi ed Eventi di attivazione.

Nome
animationfinish

Attivato quando l'animazione di transizione è completa.

Proprietà: nessuna
click

Attivato quando l'utente fa clic all'interno del grafico. Può essere utilizzato per identificare quando gli utenti fanno clic su titolo, elementi dati, voci di legenda, assi, linee di griglia o etichette.

Proprietà: targetID
error

Attivato quando si verifica un errore durante il tentativo di rendering del grafico.

Proprietà: id, messaggio
legendpagination

Attivato quando l'utente fa clic sulle frecce di impaginazione della legenda. Rimanda l'indice della pagina attuale con base zero e il numero totale di pagine.

Proprietà: currentPageIndex, totalpages
onmouseover

Attivato quando l'utente passa il mouse sopra un'entità visiva. Rimanda gli indici delle righe e delle colonne dell'elemento della tabella dati corrispondente.

Proprietà: riga, colonna
onmouseout

Attivato quando l'utente allontana il puntatore del mouse da un'entità visiva. Rimanda gli indici delle righe e delle colonne dell'elemento della tabella dati corrispondente.

Proprietà: riga, colonna
ready

Il grafico è pronto per le chiamate ai metodi esterni. Se vuoi interagire con il grafico e chiamare i metodi dopo averlo disegnato, devi configurare un listener per questo evento prima di chiamare il metodo draw e di chiamarlo solo dopo che è stato attivato l'evento.

Proprietà: nessuna
select

Attivato quando l'utente fa clic su un'entità visiva. Per sapere cosa è stato selezionato, chiama il numero getSelection().

Proprietà: nessuna

Norme sui dati

Tutto il codice e i dati vengono elaborati e visualizzati nel browser. Nessun dato viene inviato ad alcun server.