如何根据数据维度更改条形颜色?
How to change bars colors based on a data dimension?
首先,这是一个简单的fiddle,我为了帮助解决我的问题而做的:
jsfiddle.net/rogeraleite/xbd0zpzn/4
...根据 fiddle 上显示的图表,我要执行的任务是:
将所有者至少有一个 "approved_flag == 0" 的条变成红色(对于此数据,Mike 的条会变成红色)。
看起来很简单,但我还是做不到=/。
我使用的代码:
var experiments = [
{ Name: "Mike", amount: 26.9, approved_flag: 1 },
{ Name: "Mike", amount: 2.9, approved_flag: 1 },
{ Name: "Mike", amount: 14.9, approved_flag: 0 },
{ Name: "John", amount: 22.5, approved_flag: 1 },
{ Name: "John", amount: 13.5, approved_flag: 1 },
{ Name: "Firen", amount: 44.3, approved_flag: 1 },
{ Name: "Firen", amount: 24.3, approved_flag: 1 }
];
var ndx = crossfilter(experiments);
var all = ndx.groupAll();
var nameDimension = ndx.dimension(function (d) { return d.Name; });
var nameGroup = nameDimension.group().reduceSum(function (d) { return d.amount; });
var chart1 = dc.barChart('#rowChart');
chart1.width(600)
.height(250)
.margins({ top: 10, right: 10, bottom: 20, left: 40 })
.dimension(nameDimension)
.group(nameGroup)
.transitionDuration(500)
.colors('teal')
.elasticY(false)
.brushOn(false)
.valueAccessor(function (d) {
return d.value;
})
.title(function (d) {
return "\nNumber of Povetry: " + d.key;
})
.x(d3.scale.ordinal().domain(nameDimension.top(Infinity).map(function(d) {return d.Name})))
.xUnits(dc.units.ordinal)
.legend(dc.legend().x(45).y(20).itemHeight(8).gap(4));
dc.renderAll();
在此先感谢您对我的帮助,
--罗杰
您实际上是在为每个组减少两个值,因此您需要自定义减少来执行此操作。有趣的是,您必须跟踪另一个过滤器是否导致最后一个 false approved_flag
从组中删除。但是,一旦您使用自定义缩减,这实际上并不复杂:我们将只计算 false approved_flag
.
的数量
使用 reductio 可能更容易,但这里是直接的交叉过滤方式:
var nameGroup = nameDimension.group().reduce(
function (p, v) { // add
p.amount += v.amount
if(!v.approved_flag)
p.unapproved++;
return p;
},
function (p, v) { // remove
p.amount -= v.amount
if(!v.approved_flag)
p.unapproved--;
return p;
},
function () { // initialize
return {amount: 0, unapproved: 0};
}
);
默认情况下,条形图仅根据堆叠层分配颜色。对于这个简单的双色案例,我们可以将 colors
刻度和 return 来自 colorAccessor
:
的颜色名称短路
.colors(function(x) { return x; })
.colorAccessor(function(d) {
return (!this.name && d.value.unapproved) ? 'red' : 'teal';
})
您的 fiddle 分支,在此处添加了这些内容:
http://jsfiddle.net/gordonwoodhull/6L2kryvq/17/
编辑:更新了 fiddle 和 colorAccessor,因为第一次尝试打破了图例,它传递了一个层而不是数据。
首先,这是一个简单的fiddle,我为了帮助解决我的问题而做的:
jsfiddle.net/rogeraleite/xbd0zpzn/4
...根据 fiddle 上显示的图表,我要执行的任务是:
将所有者至少有一个 "approved_flag == 0" 的条变成红色(对于此数据,Mike 的条会变成红色)。
看起来很简单,但我还是做不到=/。
我使用的代码:
var experiments = [
{ Name: "Mike", amount: 26.9, approved_flag: 1 },
{ Name: "Mike", amount: 2.9, approved_flag: 1 },
{ Name: "Mike", amount: 14.9, approved_flag: 0 },
{ Name: "John", amount: 22.5, approved_flag: 1 },
{ Name: "John", amount: 13.5, approved_flag: 1 },
{ Name: "Firen", amount: 44.3, approved_flag: 1 },
{ Name: "Firen", amount: 24.3, approved_flag: 1 }
];
var ndx = crossfilter(experiments);
var all = ndx.groupAll();
var nameDimension = ndx.dimension(function (d) { return d.Name; });
var nameGroup = nameDimension.group().reduceSum(function (d) { return d.amount; });
var chart1 = dc.barChart('#rowChart');
chart1.width(600)
.height(250)
.margins({ top: 10, right: 10, bottom: 20, left: 40 })
.dimension(nameDimension)
.group(nameGroup)
.transitionDuration(500)
.colors('teal')
.elasticY(false)
.brushOn(false)
.valueAccessor(function (d) {
return d.value;
})
.title(function (d) {
return "\nNumber of Povetry: " + d.key;
})
.x(d3.scale.ordinal().domain(nameDimension.top(Infinity).map(function(d) {return d.Name})))
.xUnits(dc.units.ordinal)
.legend(dc.legend().x(45).y(20).itemHeight(8).gap(4));
dc.renderAll();
在此先感谢您对我的帮助, --罗杰
您实际上是在为每个组减少两个值,因此您需要自定义减少来执行此操作。有趣的是,您必须跟踪另一个过滤器是否导致最后一个 false approved_flag
从组中删除。但是,一旦您使用自定义缩减,这实际上并不复杂:我们将只计算 false approved_flag
.
使用 reductio 可能更容易,但这里是直接的交叉过滤方式:
var nameGroup = nameDimension.group().reduce(
function (p, v) { // add
p.amount += v.amount
if(!v.approved_flag)
p.unapproved++;
return p;
},
function (p, v) { // remove
p.amount -= v.amount
if(!v.approved_flag)
p.unapproved--;
return p;
},
function () { // initialize
return {amount: 0, unapproved: 0};
}
);
默认情况下,条形图仅根据堆叠层分配颜色。对于这个简单的双色案例,我们可以将 colors
刻度和 return 来自 colorAccessor
:
.colors(function(x) { return x; })
.colorAccessor(function(d) {
return (!this.name && d.value.unapproved) ? 'red' : 'teal';
})
您的 fiddle 分支,在此处添加了这些内容: http://jsfiddle.net/gordonwoodhull/6L2kryvq/17/
编辑:更新了 fiddle 和 colorAccessor,因为第一次尝试打破了图例,它传递了一个层而不是数据。