如何使用带值的向量为散点图着色?
How can I color my scatter using a vector with values?
好吧,我想使用带有值的向量为我的散点图着色。实际上,我想使用其他维度而不是用于创建散点的维度。
使用这些线,它使用散点图所基于的维度给出的值为我的散点图赋予颜色。
.colorAccessor(function(d) {return d.key[1]})
.colors(d3.scaleSequential(d3.interpolateOranges))
.colorDomain(y_range)
y_range = [y_min, y_max]
我试图在散点图的维度中包含颜色列,但它减慢了过滤过程。像这样:
scatterDim = crossFilter.dimension(function(d) { return [d[it.variable[0]], d[it.variable[1]], d[it.color]]})
.colorAccessor(function(d) {return d.key[2]})
.colors(d3.scaleSequential(d3.interpolatePlasma))
.colorDomain([colorUnits[0], colorUnits[colorUnits.length - 1]]),
我想要颜色的不同维度:
colorDimension = crossFilter.dimension(function (d) { return d[it.color] }),
colorGroup = colorDimension.group().reduceCount(),
colorAll = colorGroup.all(),
colorUnits = [],
count = 0;
for(var color in colorAll)
{
colorUnits[count] = colorAll[color].key;
count++;
}
.colorAccessor(//some different code for my vector colorUnits or even for dimension?!//)
.colors(d3.scaleSequential(d3.interpolatePlasma))
.colorDomain([colorUnits[0], colorUnits[colorUnits.length - 1]]),
我也想知道如何使用 scaleOrdinal 来显示颜色。如果向量 colorUnits 包含字符串。
名字"dimension"在crossfilter和dc.js中有点混乱。它不用于描述 "Y"(聚合)值或颜色。
真正的意思是,"I want to bin my data by this key, and filter on it."
在许多示例中,您会发现颜色作为维度键中的第三个元素的原因是它很方便。更改键比更改聚合值更容易。但这并没有什么意义。
当您向维度键添加颜色时图表变慢这一事实告诉我您没有为每个 X/Y 对设置唯一的颜色。不是为每个 X/Y 对画一个点,而是为每个 X/Y/颜色三元组画一个点。
您也不需要创建单独的颜色维度,除非您想要对颜色进行分类、聚合或过滤。
假设每 X/Y 对只需要一个点,您需要决定使用哪种颜色。然后您可以更改 reduction,而不是密钥,以添加此数据:
scatterDim = crossFilter.dimension(function(d) {
return [d[it.variable[0]], d[it.variable[1]]];
}),
scatterGroup = scatterDim.group().reduce(
function(p, v) { // add
p.count++; // reduceCount equivalent
p.color = combine_colors(p.color, v[it.color]);
return p;
},
function(p, v) { // remove
p.count--;
// maybe adjust p.color
return p;
},
function() { // init
return {count: 0, color: null};
}
);
如果您不关心使用哪种颜色,则不需要combine_colors
;只需使用 v[it.color]
。否则,这是您需要根据您的应用程序来决定的事情。
现在散点组有对象作为其值,您可以更改散点图以利用它们:
scatterPlot
.existenceAccessor(d => d.value.count) // don't draw dot when it is zero
.colorAccessor(d => d.value.color)
如果你确实想用不同的颜色绘制所有的点,例如使用不透明度来允许过度绘制,你可能需要一个 canvas 散点图的实现,因为 SVG 只适用于数千点。 There is one in the works for dc.js但需要移植到最新的API。
I would also like to know how to use scaleOrdinal for color. In case that the vector colorUnits contains strings.
不确定你的意思。 scaleOrdinal
以字符串为域,所以
.colors(d3.scaleOrdinal(colorUnits, output_colors))
应该可以吗?
例子
由于我无法传达某些东西,这里有一个例子。颜色字符串来自数组,因为我没有您的数据或代码示例:
const names = ["Zero", "One", "Two", "Three", "Four", "Five"];
speedSumGroup = runDimension.group()
.reduce(
function(p, v) { // add
p.count++; // reduceCount equivalent
p.color = names[+v.Expt];
return p;
},
// ... as before
);
chart
.colorAccessor(d => d.value.color)
.colors(d3.scaleOrdinal(names, d3.schemeCategory10))
再次重申,如果该方法对您不起作用,最好的解决方法是记录 speedSumGroup.all()
。我得到:
[
{
"key": [
1,
850
],
"value": {
"count": 1,
"color": "One"
}
},
{
"key": [
1,
880
],
"value": {
"count": 1,
"color": "Three"
}
},
{
"key": [
1,
890
],
"value": {
"count": 2,
"color": "Five"
}
},
// ...
]
好吧,我想使用带有值的向量为我的散点图着色。实际上,我想使用其他维度而不是用于创建散点的维度。
使用这些线,它使用散点图所基于的维度给出的值为我的散点图赋予颜色。
.colorAccessor(function(d) {return d.key[1]})
.colors(d3.scaleSequential(d3.interpolateOranges))
.colorDomain(y_range)
y_range = [y_min, y_max]
我试图在散点图的维度中包含颜色列,但它减慢了过滤过程。像这样:
scatterDim = crossFilter.dimension(function(d) { return [d[it.variable[0]], d[it.variable[1]], d[it.color]]})
.colorAccessor(function(d) {return d.key[2]})
.colors(d3.scaleSequential(d3.interpolatePlasma))
.colorDomain([colorUnits[0], colorUnits[colorUnits.length - 1]]),
我想要颜色的不同维度:
colorDimension = crossFilter.dimension(function (d) { return d[it.color] }),
colorGroup = colorDimension.group().reduceCount(),
colorAll = colorGroup.all(),
colorUnits = [],
count = 0;
for(var color in colorAll)
{
colorUnits[count] = colorAll[color].key;
count++;
}
.colorAccessor(//some different code for my vector colorUnits or even for dimension?!//)
.colors(d3.scaleSequential(d3.interpolatePlasma))
.colorDomain([colorUnits[0], colorUnits[colorUnits.length - 1]]),
我也想知道如何使用 scaleOrdinal 来显示颜色。如果向量 colorUnits 包含字符串。
名字"dimension"在crossfilter和dc.js中有点混乱。它不用于描述 "Y"(聚合)值或颜色。
真正的意思是,"I want to bin my data by this key, and filter on it."
在许多示例中,您会发现颜色作为维度键中的第三个元素的原因是它很方便。更改键比更改聚合值更容易。但这并没有什么意义。
当您向维度键添加颜色时图表变慢这一事实告诉我您没有为每个 X/Y 对设置唯一的颜色。不是为每个 X/Y 对画一个点,而是为每个 X/Y/颜色三元组画一个点。
您也不需要创建单独的颜色维度,除非您想要对颜色进行分类、聚合或过滤。
假设每 X/Y 对只需要一个点,您需要决定使用哪种颜色。然后您可以更改 reduction,而不是密钥,以添加此数据:
scatterDim = crossFilter.dimension(function(d) {
return [d[it.variable[0]], d[it.variable[1]]];
}),
scatterGroup = scatterDim.group().reduce(
function(p, v) { // add
p.count++; // reduceCount equivalent
p.color = combine_colors(p.color, v[it.color]);
return p;
},
function(p, v) { // remove
p.count--;
// maybe adjust p.color
return p;
},
function() { // init
return {count: 0, color: null};
}
);
如果您不关心使用哪种颜色,则不需要combine_colors
;只需使用 v[it.color]
。否则,这是您需要根据您的应用程序来决定的事情。
现在散点组有对象作为其值,您可以更改散点图以利用它们:
scatterPlot
.existenceAccessor(d => d.value.count) // don't draw dot when it is zero
.colorAccessor(d => d.value.color)
如果你确实想用不同的颜色绘制所有的点,例如使用不透明度来允许过度绘制,你可能需要一个 canvas 散点图的实现,因为 SVG 只适用于数千点。 There is one in the works for dc.js但需要移植到最新的API。
I would also like to know how to use scaleOrdinal for color. In case that the vector colorUnits contains strings.
不确定你的意思。 scaleOrdinal
以字符串为域,所以
.colors(d3.scaleOrdinal(colorUnits, output_colors))
应该可以吗?
例子
由于我无法传达某些东西,这里有一个例子。颜色字符串来自数组,因为我没有您的数据或代码示例:
const names = ["Zero", "One", "Two", "Three", "Four", "Five"];
speedSumGroup = runDimension.group()
.reduce(
function(p, v) { // add
p.count++; // reduceCount equivalent
p.color = names[+v.Expt];
return p;
},
// ... as before
);
chart
.colorAccessor(d => d.value.color)
.colors(d3.scaleOrdinal(names, d3.schemeCategory10))
再次重申,如果该方法对您不起作用,最好的解决方法是记录 speedSumGroup.all()
。我得到:
[
{
"key": [
1,
850
],
"value": {
"count": 1,
"color": "One"
}
},
{
"key": [
1,
880
],
"value": {
"count": 1,
"color": "Three"
}
},
{
"key": [
1,
890
],
"value": {
"count": 2,
"color": "Five"
}
},
// ...
]