如何对 c3.js 条形图进行排序
How to sort c3.js bar chart
我期待使用 c3.js 对条形图中的条形图(不是堆积条形图)进行排序。但是找不到合适的方法,下面提到了一个选项,但它不适用于条形图。
data: {
order: 'asc'
}
在我的例子中,所有数据都是动态传入的,并通过 c3.js 呈现以制作一个条形图 chart.I 正在寻找类似 https://bl.ocks.org/mbostock/raw/3885705/
的类型
您的 jsfiddle 方向正确,但由于传递给 c3.generate()
的数据是一组数据集,因此您不能只调用 data.sort()。
编辑
对于这种特定情况,如果您的数据采用您在评论中描述的形式,这将是一种合适的方法。
我主要使用数组函数,如切片、拼接、映射和排序。如果您正在操作和绘制数据,这些是需要熟悉的关键函数。 mozzila docs 是一个很好的起点。
您还应该注意哪些函数修改了调用它们的数组,哪些 return 一个新数组;在您无意的情况下更改您的数据通常会导致难以发现的错误。
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>
我期待使用 c3.js 对条形图中的条形图(不是堆积条形图)进行排序。但是找不到合适的方法,下面提到了一个选项,但它不适用于条形图。
data: {
order: 'asc'
}
在我的例子中,所有数据都是动态传入的,并通过 c3.js 呈现以制作一个条形图 chart.I 正在寻找类似 https://bl.ocks.org/mbostock/raw/3885705/
的类型您的 jsfiddle 方向正确,但由于传递给 c3.generate()
的数据是一组数据集,因此您不能只调用 data.sort()。
编辑
对于这种特定情况,如果您的数据采用您在评论中描述的形式,这将是一种合适的方法。
我主要使用数组函数,如切片、拼接、映射和排序。如果您正在操作和绘制数据,这些是需要熟悉的关键函数。 mozzila docs 是一个很好的起点。
您还应该注意哪些函数修改了调用它们的数组,哪些 return 一个新数组;在您无意的情况下更改您的数据通常会导致难以发现的错误。
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>