2012-11-02 15 views
18

Sto provando a utilizzare nvd3 per creare un grafico a barre in pila verticale. Utilizzerò valori di dati discreti, anziché valori generati casualmente come nell'esempio sul loro website.nvd3 Grafico a barre in pila con valori discreti

Ho provato a giocare con l'esempio di codice live del gruppo/grafico a barre in pila e inserire dati JSON contenenti i miei valori. Quello che ho cercato di fare è stato prendere i dati JSON dal grafico a barre orizzontali e inserirli come dati per il grafico a barre verticale.

Questi sono i dati che ho usato l'esempio di codice dal vivo al posto dei dati nel grafico gruppo/barre in pila:

[ 
    { 
    "key": "Series1", 
    "color": "#d62728", 
    "values": [ 
     { 
     "label" : "Group A" , 
     "value" : -1.8746444827653 
     } , 
     { 
     "label" : "Group B" , 
     "value" : -8.0961543492239 
     } , 
     { 
     "label" : "Group C" , 
     "value" : -0.57072943117674 
     } , 
     { 
     "label" : "Group D" , 
     "value" : -2.4174010336624 
     } , 
     { 
     "label" : "Group E" , 
     "value" : -0.72009071426284 
     } , 
     { 
     "label" : "Group F" , 
     "value" : -0.77154485523777 
     } , 
     { 
     "label" : "Group G" , 
     "value" : -0.90152097798131 
     } , 
     { 
     "label" : "Group H" , 
     "value" : -0.91445417330854 
     } , 
     { 
     "label" : "Group I" , 
     "value" : -0.055746319141851 
     } 
    ] 
    }, 
    { 
    "key": "Series2", 
    "color": "#1f77b4", 
    "values": [ 
     { 
     "label" : "Group A" , 
     "value" : 25.307646510375 
     } , 
     { 
     "label" : "Group B" , 
     "value" : 16.756779544553 
     } , 
     { 
     "label" : "Group C" , 
     "value" : 18.451534877007 
     } , 
     { 
     "label" : "Group D" , 
     "value" : 8.6142352811805 
     } , 
     { 
     "label" : "Group E" , 
     "value" : 7.8082472075876 
     } , 
     { 
     "label" : "Group F" , 
     "value" : 5.259101026956 
     } , 
     { 
     "label" : "Group G" , 
     "value" : 0.30947953487127 
     } , 
     { 
     "label" : "Group H" , 
     "value" : 0 
     } , 
     { 
     "label" : "Group I" , 
     "value" : 0 
     } 
    ] 
    } 
] 

ho sostituito la chiamata di funzione per i dati() nella javascript per i dati:

nv.addGraph(function() { 
    var chart = nv.models.multiBarChart(); 

    chart.xAxis 
     .tickFormat(d3.format(',f')); 

    chart.yAxis 
     .tickFormat(d3.format(',.1f')); 

    d3.select('#chart svg') 
     .datum(data) 
     .transition().duration(500).call(chart); 

    nv.utils.windowResize(chart.update); 

    return chart; 
}); 

Il grafico etichetta correttamente la serie ma non mostra le barre. Questo grafico non può prendere questo tipo di dati? Ho ottenuto i miei dati lavorando con le barre orizzontali, ma mi piacerebbe usare le barre verticali, se possibile.

+0

Come ci si "sa" che serie da usare? –

+0

Hey @ rkseth Puoi anche fornire il tuo codice di lavoro per favore? –

risposta

40

Il/grafico a barre sovrapposte (la modello multiBarChart) gruppo viene utilizzato con x e y attributi, dove y è l'altezza della barra e x è l'etichetta e può essere un certo numero o un testo.

Purtroppo non c'è molta documentazione sul formato esatto dei dati e tutti gli esempi che ho trovato utilizzano alcune funzioni confuse per generare dati. Quindi, ecco un esempio mi sono lavoro utilizzando misti numerici e di testo etichette:

var chart = nv.models.multiBarChart(); 
 
d3.select('#chart svg').datum([ 
 
    { 
 
    key: "S1", 
 
    color: "#51A351", 
 
    values: 
 
    [  
 
     { x : "A", y : 40 }, 
 
     { x : "B", y : 30 }, 
 
     { x : 5, y : 20 } 
 
    ] 
 
    }, 
 
    { 
 
    key: "S2", 
 
    color: "#BD362F", 
 
    values: 
 
    [  
 
     { x : "A", y : 60 }, 
 
     { x : "B", y : 50 }, 
 
     { x : 5, y : 70 } 
 
    ] 
 
    } 
 
]).transition().duration(500).call(chart);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/nvd3/1.8.1/nv.d3.min.js"></script> 
 
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/nvd3/1.8.1/nv.d3.min.css"> 
 

 
<div id="chart" style="height: 200px;"><svg></svg></div>

group/stacked bar chart


Ora ci sono due problemi con il codice:

  1. È necessario rimuovere tickFormat per asse che si intende etichettare con i testi.
    La funzione tickFormat imposta un formato numerico per le etichette dell'asse. Funzionerà solo se l'etichetta può essere convertita in un numero e risulterebbe in NaN nel tuo caso.

  2. È necessario sia per rinominare gli attributi label e value a x e y o avete bisogno di creare funzioni di fornire quei valori:

    var chart = nv.models.multiBarChart(); 
    
    chart.x(function(d) { return d.label; }); 
    chart.y(function(d) { return d.value; }); 
    
    d3.select('#chart svg') 
        .datum(/* your data */) 
        .transition().duration(500).call(chart); 
    
+1

Questo ha funzionato per me! Grazie per l'aiuto. – rhlsthrm

+1

Estremamente utile, specialmente l'ultima parte in cui hai mostrato come creare funzioni per fornire qualsiasi valore desideriamo. L'ho usato per collegarlo a una casella di selezione per scegliere il valore che voglio mostrare. – dominicbri7

+0

Risposta stupenda, così utile è ... Grazie. – Vish

Problemi correlati