2013-04-24 10 views

risposta

27

Per utilizzare i propri colori, è necessario sovrascrivere i colori esistenti, preferisco non armeggiare con il codice originale.

Quindi questo è quello che ho fatto.

var myColors = ["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf"]; 
    d3.scale.myColors = function() { 
     return d3.scale.ordinal().range(myColors); 
    }; 

    nv.addGraph(function() { 
     var chart = nv.models.pieChart() 
      .x(function(d) { return d.label }) 
      .y(function(d) { return d.value }) 
      .showLabels(true).color(d3.scale.myColors().range()); 

     d3.select("#chart svg") 
      .datum(data) 
      .transition().duration(1200) 
      .call(chart); 

     return chart; 
    }); 

Tutto quello che ho fatto è stato aggiungere .color(d3.scale.myColors().range())


UPDATE :

Controllare risposta da Christopher Chiche, per la soluzione perfetta.

.color(['blue', 'green', 'yellow']) 

Spero che questo aiuti.

+0

sto usando questo, ma ho un problema, quando cambio le metriche del grafico e lo ridisegno (con nuovi colori, ho una funzione che calcola i colori in base all'etichetta), il grafico disegna colori sbagliati. quando clicco per mostrare/nascondere alcuni valori, a volte vengono ridisegnati come dovrebbero, a volte vengono ridisegnati in modo errato. Hai qualche idea del perché sia ​​così? Questo succede solo nei grafici a torta. – Nikola

+0

Farò del mio meglio per spiegarlo, ad esempio se hai 5 categorie al caricamento, il grafico prende i primi 5 colori dell'array. Quindi il tuo clour 1 sarà sempre assegnato al primo elemento dei dati. Questo potrebbe non essere il modo migliore, ma provare ad avere una matrice e mappare il colore rispetto alle torte, in modo da poter utilizzare le funzioni onclick sul led e ottenere quali elementi sono attivi e quali no, restituisce un array con le posizioni, puoi usarlo per filtrare i colori che devi passare quando ridisegni il grafico. – shabeer90

+0

no no il problema è che voglio fare smth altro, per esempio ho un insieme di dati con campi diversi in esso per ex. (ip, country, e alcuni altri), quando mostro l'ip metric (ho 4 diversi IP) raggruppo i dati, creo i colori per la torta e li renderizzo. quando cambio da ip metric a country, aggrego di nuovo i dati (ottengo 10 paesi diversi) creo i colori per loro, e poi ridisegno la torta, a prima vista il suo ok, prende i nuovi colori (questi colori non hanno nulla a che fare con i colori della torta ip), ma quando nascondo o mostro parti della torta, vengono mostrati i colori della torta IP – Nikola

43

È possibile aggiungere colori passando una matrice all'opzione "color()". Quindi aggiungi:

.color(['blue', 'green', 'yellow']) 

Se si desidera utilizzare questi colori per 3 elementi.

Nota: se si dispone di più di 3 elementi, alcuni colori verranno utilizzati più volte.

+0

Dove dobbiamo aggiungere color() ;? – GOK

+0

@GOK È necessario aggiungere 'color()' a 'chart'. Quindi dà 'chart.color (['blue', 'green', 'red'])'. –

47

Se si desidera utilizzare il colore specifico per la torta

chart.color(function(d){ 
    return d.data.color 
}); 

Poi, organizzare i dati come:

[ 
    { 
    key: "Cumulative Return", 
    values: [ 
     { 
     "label": "One", 
     "value" : 29.765957771107, 
     "color" : "#8c564b" 
     } , 
     { 
     "label": "Three", 
     "value" : 32.807804682612, 
     "color" : "#e377c2" 
     } 
    ] 
    } 
] 
+1

Grande consiglio, mi ha salvato un po 'di tempo. Grazie. –

+1

Questa è la risposta migliore, ha utilizzato la funzionalità d3 e perché nel mio caso particolare, i valori dei colori sono memorizzati in un database, quindi non posso codificarli sul mio file js come nella risposta di Christopher. – svarog

+0

Ho usato 'return d.color' per farlo funzionare. – rikpg

0

Ecco una nota che mi ha fatto, stavo installando chart.color interno nv.addGraph, questo non funzionava correttamente e invece utilizzava i valori predefiniti. Poi l'ho impostato al di fuori di questo e ha funzionato bene.

0

Io uso .color(function(d) {return [d.value > 0 ? 'blue' : 'red']}); per farlo cambiare colore in base al valore dei dati.

Spero che questo aiuti qualcuno.

0

Ecco la soluzione di dattiloscritto che è simile alla versione di JS. Diciamo che si desidera un Top 10 dei vostri risultati con 10 diversi colori:

Qui ti darò l'esempio che il lavoro per la mia PieChart o MultiBarChart

  • creare un array globale del colore come i colori = [ "# D9D9D9", "# 4B11A6", ....];
  • I dati deve essere formattato in un oggetto: MyGraph {key: "Titolo", valori: {flussi per spingere}}
  • Poi quando si crea la tabella dei dati basta premere il colore per ciascun flusso:

let stream = {}; let data = []; sia io = 0;

dataTable.forEach((period) => { 
    stream = { 'label': period.key, 'value': period.value, 'color': this.colors[i] }; 

if(period.value !== 0) { 
data.push(stream);} 
i++; 
}); 
this.myGraph = data; 

Il se la condizione è solo lì per evitare che parte vuota nel grafico

0

ho usato sotto concetto per aggiungere colore personalizzato:

// for define variable of custom colors 
var colors = ["red", "green", "blue"]; 
... 
chart { 
    color: function(d,i){ 
     return (d.data && d.data.color) || colors[i % colors.length] 
    } 
} 

Per colore dinamico sulla base di JSON dati è sufficiente aggiungere New json obj color come sotto il concetto ..

// or set custom colors directly in the data 
data = [{ 
     key: "One", 
     y: 5, 
     color: "yellow" 
    },{ 
     key: "Two", 
     y: 2, 
     color: "gray" 
    },{ 
     key: "Three", 
     y: 9 
    }, 
    ... 
]; 
Problemi correlati