我将MBostock设计的散点图矩阵(请参阅here)调整为我的数据,正如您在这个工作小提琴中看到的那样:http://jsfiddle.net/UYqmP/
正如您在此代码中看到的,我的数据具有以下json形式:
var d = ' [{"gtheta1":0.9747193937107533,"greduc-contagion":0.3775906327152618,"gtheta2":0.9377611038894604,"medOutTrafficReduction":3.0805087784299356,"medNumberPeopleInfected":99.87409839935529,"gpcr":1.0}]'
这个json取了我原来的csv:[{line1},{line2}等等。]
使用d3.js进行画笔选择允许我们选择图形的子集,所以我的问题很简单,如何检索用户对应选定圆的行,以及如何将其显示到动态表中在图形下?
我为表创建div
,并开始创建tabularfunction()
,但我不知道如何将数据检索回选定的圆圈(在d3参数中找不到好的指针) ),以及如何调用此tabularFunction()
tabulate(tab,["gpcr", "greduc-contagion","gtheta1","gtheta2","medNumberPeopleInfected", "medOutTrafficReduction"]) ;
function tabulate(data, columns) {
//Retrieve selected lines from list of circle given by D3 ?
var table = d3.select("#table").append("table").attr("style", "margin-left: 50px"),
thead = table.append("thead"),
tbody = table.append("tbody");
// append the header row
thead.append("tr")
.selectAll("th")
.data(columns)
.enter()
.append("th")
.text(function(column) { return column; });
// create a row for each object in the data
var rows = tbody.selectAll("tr")
.data(data)
.enter()
.append("tr");
// create a cell in each row for each column
var cells = rows.selectAll("td")
.data(data)
.enter()
.append("td")
.text(function(d) { return d.value; });
return table;
}
对于此函数的调用,我首先尝试将brushmove()
检索到的数据传递给tabulate()
,但这是愚蠢的,因为在鼠标的每次移动时,所有行都被添加到较旧的行,所以我需要在重绘之前删除上一个表...
function brushmove(p) {
var e = brush.extent();
var tab = svg.selectAll("circle").classed("hidden", function(d) {
return e[0][0] > d[p.x] || d[p.x] > e[1][0]
|| e[0][4] > d[p.y] || d[p.y] > e[1][5];
});
//tabulate(tab,["gpcr", "greduc-contagion","gtheta1","gtheta2","medNumberPeopleInfected", "medOutTrafficReduction"]) ;
}
更新1:
我发布了一个选择示例:
答案 0 :(得分:2)
我做了一个基于R / Shiny的应用程序,在用户画笔和表格显示之间有一个(单向)lnik。 Get the code here
以下是这个想法:
function brushend() {
if (brush.empty()){
svg.selectAll(".greyed").classed("greyed", false);
}
var circleStates = d3.select('svg')
.select('g.cell')
.selectAll('circle'[0])
.map(function(d) {return d.className['baseVal']});
Shiny.onInputChange("mydata", circleStates);
}
然后将circleStates转换为TRUE / FALSE向量,并将其用作数据帧过滤向量。
dfFilter <- input$mydata
displayDF <- baseData$df #data sent to d3.js
dfFilter[dfFilter==''] <- TRUE
dfFilter[dfFilter=='greyed'] <- FALSE
return(displayDF[dfFilter == TRUE,, drop=FALSE])
答案 1 :(得分:0)
您可以使用类似圆的测试来查找行是否在选择框内:
function brushmove(p) {
var e = brush.extent();
var tab = svg.selectAll("circle").classed("hidden", function(d) {
return e[0][0] > d[p.x] || d[p.x] > e[1][0]
|| e[0][3] > d[p.y] || d[p.y] > e[1][4];
});
var line = svg.selectAll("line").classed("selected-line", function(d) {
// perform line test here
})
var selected_lines = svg.selectAll(".selected-line");
//tabulate(tab,["gpcr", "greduc-contagion","gtheta1","gtheta2","medNumberPeopleInfected", "medOutTrafficReduction"]) ;
}