2017-10-23 3 views
-3

Ich freute mich darauf, die Balken im Balkendiagramm (nicht gestapelte Balken) mit c3.js zu sortieren. Konnte jedoch keinen geeigneten Weg finden, gibt es eine Option, die unten erwähnt wird, aber das ist nicht für das Balkendiagramm anwendbar.Wie man c3.js Balkendiagramm sortiert

data: { 
    order: 'asc' 
} 

In meinem Fall alle Daten kommen mit Ihrem jsfiddle dynamisch und Rendering durch c3.js zu Bar machen chart.I wurde wie https://bl.ocks.org/mbostock/raw/3885705/ für eine Art suchen

+0

können Sie Ihren Code schreiben oder einen jsfiddle erstellen? –

+0

@Tobias https://jsfiddle.net/sipu/cdzpkb8q/ – user3172663

+0

Haben Sie versucht, die Daten in Ihre bevorzugte Reihenfolge zu sortieren, bevor Sie die Chart-Methode zum Generieren/Laden aufrufen? – John

Antwort

2

Sie auf dem richtigen Weg waren, aber Da die an c3.generate() übergebenen Daten ein Array von Datensätzen sind, können Sie data.sort() nicht einfach aufrufen.

EDIT

Für diesen speziellen Fall, in dem Sie Ihre Daten in der Form ist, dass Sie in Ihren Kommentaren beschrieben, wäre dies eine geeignete Methode sein.

Ich habe hauptsächlich Array-Funktionen wie Slice, Splice, Map und Sort verwendet. Dies sind wichtige Funktionen, mit denen Sie sich vertraut machen können, wenn Sie Daten manipulieren und grafisch darstellen. Die mozzila docs sind ein guter Anfangspunkt.

Sie sollten auch notieren, welche Funktionen das Array ändern, an dem sie aufgerufen werden und die ein neues Array zurückgeben; Mutieren Sie Ihre Daten, wenn Sie es nicht vorhaben, kann dies oft zu Fehlern führen.

var data = [ 
 
    ["a", "b", "c"], 
 
    ['data1', "30", " 200", " 100"] 
 
] 
 

 
// declare a function to control variable scope 
 
var sortData = function(unsortedData) { 
 

 
    // deep copy array to avoid modification of input array 
 
    var sorted = unsortedData.map(function(row) { 
 
    // use slice to copy this array 
 
    return row.slice() 
 
    }) 
 

 
    // remove the dataname 
 
    var name = sorted[1].splice(0, 1); 
 

 
    // produce an array of data points [[x1,y1],[x2,y2]...] 
 
    var datapoints = sorted[1].map(function(d, i) { 
 
    // use index in map function to pull out name 
 
    // return array for datapoint [x,y] 
 
    return [sorted[0][i], d]; 
 
    }); 
 

 
    //sort datapoints 
 
    var sortedData = datapoints.sort(function(a, b) { 
 
    return a[1] - b[1]; 
 
    }); 
 

 
    // map back into separate x and y data 
 
    sorted[1] = sortedData.map(function(point, i) { 
 
    // assign x value to data[0] element 
 
    sorted[0][i] = point[0]; 
 
    // return the y data point 
 
    return point[1]; 
 
    }); 
 

 
    // add the dataname back into the y data 
 
    sorted[1] = name.concat(sorted[1]); 
 

 
    // add the 'x' label name to x-values 
 
    sorted[0].splice(0, 0, 'x') 
 

 
    // return the sorted array 
 
    return sorted 
 
} 
 

 
var chart = c3.generate({ 
 
    data: { 
 
    x: 'x', 
 
    columns: sortData(data), 
 
    type: 'bar', 
 
    }, 
 
    axis: { 
 
    x: { 
 
     type: 'category' // this needed to load string x value 
 
    } 
 
    } 
 
})
<link href="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.18/c3.css" rel="stylesheet" /> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.18/c3.js"></script> 
 

 
<div id="chart"></div>

+0

versucht habe Vielen Dank für Ihre Hilfe.Ich habe versucht, eine andere Simper eine, die nur auf Chrom arbeitete jsfiddle.net/sipu/nr0zc3h6. Aber ich habe Daten wie diese var data = [["a", "b", "c"], ["data1", "30", "200", "100"]]. Ich möchte, dass die Daten wie diese Daten gespeichert werden = [["a", "c", "b"], ["data1", "30", "100", "200"]]. Also bitte helfen Sie mir – user3172663

+0

Die einfachste Methode besteht darin, die x- und y-Daten zu einem Array von Datenpunkten zu kombinieren - jeder Datenpunkt wird entweder als Objekt wie {x: "a", y: "30"} oder als Array dargestellt ["a", "30"] und verwende eine Konvention, damit du weißt, welches Element das x enthält und welches Element das y enthält. Sie können dann die Sortierfunktion als Funktion (a, b) {return a.y - b.y} ändern, wenn Sie Objekte oder Funktionen (a, b) verwenden {return a [1] - b [1]} für Arrays. Vergessen Sie nicht, den Spaltennamen 'data1' vor dem Sortieren zu entfernen und fügen Sie ihn dann wieder hinzu. Das sollte hoffentlich ausreichen, um Sie dahin zu bringen, wo Sie sein müssen. – John

+0

Ihre jsfiddle (jsfiddle.net/sipu/nr0zc3h6) berücksichtigt nicht die Tatsache, dass Ihr erstes Element im Array der Name der Daten ist, so dass es Probleme verursachen wird. Ich habe meine Post bearbeitet, um Ihr Eingabedatenformat zu berücksichtigen – John