Javascript 颜色编码平行坐标
我已经有了绘制平行坐标的代码,效果很好。我可以为一些特征绘制平行坐标(Javascript 颜色编码平行坐标,javascript,d3.js,parallel-coordinates,Javascript,D3.js,Parallel Coordinates,我已经有了绘制平行坐标的代码,效果很好。我可以为一些特征绘制平行坐标(标签,特征1,特征2,…,特征5:我数据库的一些特定列) 在我的测试输入文件中,labelfeature的值为1、2或3。现在,我想删除标签轴,而是使用3种颜色对平行坐标可视化进行颜色编码。我不知道怎么做。如果你能帮助我,我将不胜感激 var m = [30, 10, 10, 10], w = 800 - m[1] - m[3], h = 500 - m[0] - m[2]; var x = d3.scale
标签,特征1,特征2,…,特征5
:我数据库的一些特定列)
在我的测试输入文件中,label
feature的值为1、2或3。现在,我想删除标签
轴,而是使用3种颜色对平行坐标可视化进行颜色编码。我不知道怎么做。如果你能帮助我,我将不胜感激
var m = [30, 10, 10, 10],
w = 800 - m[1] - m[3],
h = 500 - m[0] - m[2];
var x = d3.scale.ordinal().rangePoints([0, w], 1),
y = {},
dragging = {};
var line = d3.svg.line(),
axis = d3.svg.axis().orient("left"),
background,
foreground;
var svg = d3.select("body").append("svg:svg")
.attr("width", w + m[1] + m[3])
.attr("height", h + m[0] + m[2])
.append("svg:g")
.attr("transform", "translate(" + m[3] + "," + m[0] + ")");
// Input data (test.csv) is in this link : http://pastebin.com/raw.php?i=8nTGRenj
d3.csv("test.csv").row(function (d) {
return {
// Features that are needed to be visualize
label: d.label,
feature1: d.feature1,
feature2: d.feature2,
feature3: d.feature3,
feature4: d.feature4,
feature5: d.feature5
};
})
.get(function (e, data) {
x.domain(
dimensions = d3.keys(data[0])
.filter(function (d) {
if (d == "label") {
y[d] = d3.scale.linear()
.domain(d3.extent(data, function (p) {
return +p[d];
}))
.range([h, 0]);
} else {
y[d] = d3.scale.linear()
.domain([0, 100])
.range([h, 0]);
}
return true;
}));
// Add grey background lines for context.
background = svg.append("svg:g")
.attr("class", "background")
.selectAll("path")
.data(data)
.enter().append("svg:path")
.attr("d", path);
// Add blue foreground lines for focus.
foreground = svg.append("svg:g")
.attr("class", "foreground")
.selectAll("path")
.data(data)
.enter().append("svg:path")
.attr("d", path);
// Add a group element for each dimension.
var g = svg.selectAll(".dimension")
.data(dimensions)
.enter().append("svg:g")
.attr("class", "dimension")
.attr("transform", function (d) {
return "translate(" + x(d) + ")";
})
.call(d3.behavior.drag()
.on("dragstart", function (d) {
dragging[d] = this.__origin__ = x(d);
background.attr("visibility", "hidden");
})
.on("drag", function (d) {
dragging[d] = Math.min(w, Math.max(0, this.__origin__ += d3.event.dx));
foreground.attr("d", path);
dimensions.sort(function (a, b) {
return position(a) - position(b);
});
x.domain(dimensions);
g.attr("transform", function (d) {
return "translate(" + position(d) + ")";
});
})
.on("dragend", function (d) {
delete this.__origin__;
delete dragging[d];
transition(d3.select(this)).attr("transform", "translate(" + x(d) + ")");
transition(foreground)
.attr("d", path);
background.attr("d", path)
.transition()
.delay(500)
.duration(0)
.attr("visibility", null);
}));
// Add an axis and title.
g.append("svg:g")
.attr("class", "axis")
.each(function (d) {
d3.select(this).call(axis.scale(y[d]));
})
.append("svg:text")
.attr("text-anchor", "middle")
.attr("y", -9)
.text(String);
// Add and store a brush for each axis.
g.append("svg:g")
.attr("class", "brush")
.each(function (d) {
d3.select(this).call(y[d].brush = d3.svg.brush().y(y[d]).on("brush", brush));
})
.selectAll("rect")
.attr("x", -8)
.attr("width", 16);
});
function position(d) {
var v = dragging[d];
return v === null ? x(d) : v;
}
function transition(g) {
return g.transition().duration(500);
}
// Returns the path for a given data point.
function path(d) {
return line(dimensions.map(function (p) {
return [position(p), y[p](d[p])];
}));
}
// Handles a brush event, toggling the display of foreground lines.
function brush() {
var actives = dimensions.filter(function (p) {
return !y[p].brush.empty();
}),
extents = actives.map(function (p) {
return y[p].brush.extent();
});
foreground.style("display", function (d) {
return actives.every(function (p, i) {
return extents[i][0] <= d[p] && d[p] <= extents[i][1];
}) ? null : "none";
});
}
此外,您可以在此处找到我的代码:
(另外,“test.csv”是;我无法将其链接到我的代码。)我无法让您的示例正常工作,但我可以告诉您该怎么做 首先,您需要创建一个颜色比例,它是顺序比例。然后,您可以将域设置为输入值的数组(在您的案例1、2和3中),范围应该是与这些输入对应的颜色。例如:
var color = d3.scale.ordinal()
.domain([1,2,3])
.range(['red','green','blue']);
然后,在创建路径
元素时,可以使用比例使笔划颜色成为标签数据的函数:
foreground = svg.append('svg:g')
.attr('class', 'foreground')
.selectAll('path')
.data(data)
.enter().append('svg:path')
.attr('d', path)
.attr('stroke', function(d) { return color(d.label); });
然后确保从css中删除前景的笔划样式,这样它就不会覆盖您提供的比例值
这使用了来自的cars数据的子集。路径数据属性中填充了
NaN
值时出现了问题。我创建了一个plunk以便可以链接csv文件,但请检查控制台输出中的错误。
foreground = svg.append('svg:g')
.attr('class', 'foreground')
.selectAll('path')
.data(data)
.enter().append('svg:path')
.attr('d', path)
.attr('stroke', function(d) { return color(d.label); });