|
|
|
@ -1,41 +1,41 @@ |
|
|
|
|
<template> |
|
|
|
|
<div> |
|
|
|
|
<div id="tree-container"></div> |
|
|
|
|
<div id="tree-container" style="min-height: 500px"></div> |
|
|
|
|
<div id="toolbar"> |
|
|
|
|
<div class="tool"> |
|
|
|
|
<div class="tlabel">Zoom</div> |
|
|
|
|
<div class="tbuttons"> |
|
|
|
|
<div class="button" data-key="187" title="Zoom In (+ OR scrollwheel)">+</div> |
|
|
|
|
<div class="button" data-key="189" title="Zoom Out (− OR scrollwheel)">−</div> |
|
|
|
|
<div class="button" data-key="187" title="Zoom In">+</div> |
|
|
|
|
<div class="button" data-key="189" title="Zoom Out">−</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div class="tool"> |
|
|
|
|
<div class="tlabel">Rotate</div> |
|
|
|
|
<div class="tbuttons"> |
|
|
|
|
<div class="button" data-key="33" title="Rotate CCW (Page Up OR ⇧scrollwheel)" style="font-size:0.9em">↺</div> |
|
|
|
|
<div class="button" data-key="34" title="Rotate CW (Page Down OR ⇧scrollwheel)" style="font-size:0.9em">↻</div> |
|
|
|
|
<div class="button" data-key="33" title="Rotate CCW" style="font-size:0.9em">↺</div> |
|
|
|
|
<div class="button" data-key="34" title="Rotate CW" style="font-size:0.9em">↻</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div class="tool"> |
|
|
|
|
<div class="tlabel">Select</div> |
|
|
|
|
<div class="tbuttons"> |
|
|
|
|
<div class="button" data-key="-38" title="Select Previous (⇧↑)" style="font-size:0.9em">↥</div> |
|
|
|
|
<div class="button" data-key="-40" title="Select Next (⇧↓)" style="font-size:0.9em">↧</div> |
|
|
|
|
<div class="button" data-key="-38" title="Select Previous" style="font-size:0.9em">↥</div> |
|
|
|
|
<div class="button" data-key="-40" title="Select Next" style="font-size:0.9em">↧</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div class="tool"> |
|
|
|
|
<div class="tlabel">View</div> |
|
|
|
|
<div class="tbuttons"> |
|
|
|
|
<div class="button" data-key="36" title="Center Root (Home)">⌂</div> |
|
|
|
|
<div class="button" data-key="35" title="Center Selected (End)" style="font-size:0.8em">◉</div> |
|
|
|
|
<div class="button" data-key="36" title="Center Root">⌂</div> |
|
|
|
|
<div class="button" data-key="35" title="Center Selected" style="font-size:0.8em">◉</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div class="tool"> |
|
|
|
|
<div class="tlabel">Toggle</div> |
|
|
|
|
<div class="tbuttons"> |
|
|
|
|
<div class="button" data-key="32" title="Toggle Node (Space OR double-click)">1</div> |
|
|
|
|
<div class="button" data-key="13" title="Toggle Level (Return OR ⇧double-click)">⊕</div> |
|
|
|
|
<div class="button" data-key="191" title="Toggle Root (/)">/</div> |
|
|
|
|
<div class="button" data-key="32" title="Toggle Node">1</div> |
|
|
|
|
<div class="button" data-key="13" title="Toggle Level">⊕</div> |
|
|
|
|
<div class="button" data-key="191" title="Toggle Root">/</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div class="tool"> |
|
|
|
@ -64,157 +64,113 @@ export default { |
|
|
|
|
name: 'FeatureSpaceOverview', |
|
|
|
|
data () { |
|
|
|
|
return { |
|
|
|
|
dataFS1: [], |
|
|
|
|
dataFS1Trans: [], |
|
|
|
|
jsonData: [], |
|
|
|
|
corrMatrixComb: [], |
|
|
|
|
corrMatrixCombTotal: [], |
|
|
|
|
VIFRemaining: [], |
|
|
|
|
MIRemaining: [], |
|
|
|
|
computeNodes: 0 |
|
|
|
|
colorsReceive: [], |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
methods: { |
|
|
|
|
initializeRadialTree() { |
|
|
|
|
|
|
|
|
|
}, |
|
|
|
|
reset () { |
|
|
|
|
var svg = d3.select("#FeatureTree"); |
|
|
|
|
svg.selectAll("*").remove(); |
|
|
|
|
}, |
|
|
|
|
// Get JSON data |
|
|
|
|
radialTree() { |
|
|
|
|
|
|
|
|
|
initializeRadialTree() { |
|
|
|
|
|
|
|
|
|
var features = this.colorsReceive |
|
|
|
|
|
|
|
|
|
var featuresQuad1 = [] |
|
|
|
|
var featuresQuad2 = [] |
|
|
|
|
var featuresQuad3 = [] |
|
|
|
|
var featuresQuad4 = [] |
|
|
|
|
var featuresQuad5 = [] |
|
|
|
|
|
|
|
|
|
for (let i = 0; i < features[4].length; i++) { |
|
|
|
|
featuresQuad1.push({"name": features[0][i].key, |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Round", "lin_color": features[0][i].value[0].valueIns}, |
|
|
|
|
{"name": "Round logE", "lin_color": features[0][i].value[1].valueIns}, |
|
|
|
|
{"name": "Round log2", "lin_color": features[0][i].value[2].valueIns}, |
|
|
|
|
{"name": "Round log10", "lin_color": features[0][i].value[3].valueIns}, |
|
|
|
|
], |
|
|
|
|
"lin_color": features[0][i].value[0].valueIns+features[0][i].value[1].valueIns+features[0][i].value[3].valueIns+features[0][i].value[3].valueIns |
|
|
|
|
}) |
|
|
|
|
featuresQuad2.push({"name": features[1][i].key, |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Round", "lin_color": features[1][i].value[0].valueIns}, |
|
|
|
|
{"name": "Round logE", "lin_color": features[1][i].value[1].valueIns}, |
|
|
|
|
{"name": "Round log2", "lin_color": features[1][i].value[2].valueIns}, |
|
|
|
|
{"name": "Round log10", "lin_color": features[1][i].value[3].valueIns}, |
|
|
|
|
], |
|
|
|
|
"lin_color": features[1][i].value[0].valueIns+features[1][i].value[1].valueIns+features[1][i].value[3].valueIns+features[1][i].value[3].valueIns |
|
|
|
|
}) |
|
|
|
|
featuresQuad3.push({"name": features[2][i].key, |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Round", "lin_color": features[2][i].value[0].valueIns}, |
|
|
|
|
{"name": "Round logE", "lin_color": features[2][i].value[1].valueIns}, |
|
|
|
|
{"name": "Round log2", "lin_color": features[2][i].value[2].valueIns}, |
|
|
|
|
{"name": "Round log10", "lin_color": features[2][i].value[3].valueIns}, |
|
|
|
|
], |
|
|
|
|
"lin_color": features[2][i].value[0].valueIns+features[2][i].value[1].valueIns+features[2][i].value[3].valueIns+features[2][i].value[3].valueIns |
|
|
|
|
}) |
|
|
|
|
featuresQuad4.push({"name": features[3][i].key, |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Round", "lin_color": features[3][i].value[0].valueIns}, |
|
|
|
|
{"name": "Round logE", "lin_color": features[3][i].value[1].valueIns}, |
|
|
|
|
{"name": "Round log2", "lin_color": features[3][i].value[2].valueIns}, |
|
|
|
|
{"name": "Round log10", "lin_color": features[3][i].value[3].valueIns}, |
|
|
|
|
], |
|
|
|
|
"lin_color": features[3][i].value[0].valueIns+features[3][i].value[1].valueIns+features[3][i].value[3].valueIns+features[3][i].value[3].valueIns |
|
|
|
|
}) |
|
|
|
|
featuresQuad5.push({"name": features[4][i].key, |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Round", "lin_color": features[4][i].value[0].valueIns}, |
|
|
|
|
{"name": "Round logE", "lin_color": features[4][i].value[1].valueIns}, |
|
|
|
|
{"name": "Round log2", "lin_color": features[4][i].value[2].valueIns}, |
|
|
|
|
{"name": "Round log10", "lin_color": features[4][i].value[3].valueIns}, |
|
|
|
|
], |
|
|
|
|
"lin_color": features[4][i].value[0].valueIns+features[4][i].value[1].valueIns+features[4][i].value[3].valueIns+features[4][i].value[3].valueIns |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var spaceSlice1=0 |
|
|
|
|
var spaceSlice2 = 0 |
|
|
|
|
var spaceSlice3 = 0 |
|
|
|
|
var spaceSlice4 = 0 |
|
|
|
|
var spaceSlice5 = 0 |
|
|
|
|
|
|
|
|
|
for (let i = 0; i < featuresQuad5.length; i++) { |
|
|
|
|
spaceSlice4 = spaceSlice4 + featuresQuad4[i].lin_color |
|
|
|
|
spaceSlice5 = spaceSlice5 + featuresQuad5[i].lin_color |
|
|
|
|
spaceSlice1 = spaceSlice1 + featuresQuad1[i].lin_color |
|
|
|
|
spaceSlice2 = spaceSlice2 + featuresQuad2[i].lin_color |
|
|
|
|
spaceSlice3 = spaceSlice3 + featuresQuad3[i].lin_color |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var treeData = { |
|
|
|
|
"name": "All predictions", |
|
|
|
|
"name": "Data", |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Worst predictions", |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Feature 1", |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Round"}, |
|
|
|
|
{"name": "Round logE"}, |
|
|
|
|
{"name": "Round log2"}, |
|
|
|
|
{"name": "Round log10"}, |
|
|
|
|
]}, |
|
|
|
|
{"name": "Feature 2", |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Round"}, |
|
|
|
|
{"name": "Round logE"}, |
|
|
|
|
{"name": "Round log2"}, |
|
|
|
|
{"name": "Round log10"}, |
|
|
|
|
]}, |
|
|
|
|
{"name": "Feature 3", |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Round"}, |
|
|
|
|
{"name": "Round logE"}, |
|
|
|
|
{"name": "Round log2"}, |
|
|
|
|
{"name": "Round log10"}, |
|
|
|
|
]}, |
|
|
|
|
{"name": "Feature 4", |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Round"}, |
|
|
|
|
{"name": "Round logE"}, |
|
|
|
|
{"name": "Round log2"}, |
|
|
|
|
{"name": "Round log10"}, |
|
|
|
|
]}, |
|
|
|
|
]}, |
|
|
|
|
{"name": "Best predictions", |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Feature 1", |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Round"}, |
|
|
|
|
{"name": "Round logE"}, |
|
|
|
|
{"name": "Round log2"}, |
|
|
|
|
{"name": "Round log10"}, |
|
|
|
|
]}, |
|
|
|
|
{"name": "Feature 2", |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Round"}, |
|
|
|
|
{"name": "Round logE"}, |
|
|
|
|
{"name": "Round log2"}, |
|
|
|
|
{"name": "Round log10"}, |
|
|
|
|
]}, |
|
|
|
|
{"name": "Feature 3", |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Round"}, |
|
|
|
|
{"name": "Round logE"}, |
|
|
|
|
{"name": "Round log2"}, |
|
|
|
|
{"name": "Round log10"}, |
|
|
|
|
]}, |
|
|
|
|
{"name": "Feature 4", |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Round"}, |
|
|
|
|
{"name": "Round logE"}, |
|
|
|
|
{"name": "Round log2"}, |
|
|
|
|
{"name": "Round log10"}, |
|
|
|
|
]}, |
|
|
|
|
]}, |
|
|
|
|
{"name": "Good predictions", |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Feature 1", |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Round"}, |
|
|
|
|
{"name": "Round logE"}, |
|
|
|
|
{"name": "Round log2"}, |
|
|
|
|
{"name": "Round log10"}, |
|
|
|
|
]}, |
|
|
|
|
{"name": "Feature 2", |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Round"}, |
|
|
|
|
{"name": "Round logE"}, |
|
|
|
|
{"name": "Round log2"}, |
|
|
|
|
{"name": "Round log10"}, |
|
|
|
|
]}, |
|
|
|
|
{"name": "Feature 3", |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Round"}, |
|
|
|
|
{"name": "Round logE"}, |
|
|
|
|
{"name": "Round log2"}, |
|
|
|
|
{"name": "Round log10"}, |
|
|
|
|
]}, |
|
|
|
|
{"name": "Feature 4", |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Round"}, |
|
|
|
|
{"name": "Round logE"}, |
|
|
|
|
{"name": "Round log2"}, |
|
|
|
|
{"name": "Round log10"}, |
|
|
|
|
]}, |
|
|
|
|
]}, |
|
|
|
|
{"name": "Bad predictions", |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Feature 1", |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Round"}, |
|
|
|
|
{"name": "Round logE"}, |
|
|
|
|
{"name": "Round log2"}, |
|
|
|
|
{"name": "Round log10"}, |
|
|
|
|
]}, |
|
|
|
|
{"name": "Feature 2", |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Round"}, |
|
|
|
|
{"name": "Round logE"}, |
|
|
|
|
{"name": "Round log2"}, |
|
|
|
|
{"name": "Round log10"}, |
|
|
|
|
]}, |
|
|
|
|
{"name": "Feature 3", |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Round"}, |
|
|
|
|
{"name": "Round logE"}, |
|
|
|
|
{"name": "Round log2"}, |
|
|
|
|
{"name": "Round log10"}, |
|
|
|
|
]}, |
|
|
|
|
{"name": "Feature 4", |
|
|
|
|
"children": [ |
|
|
|
|
{"name": "Round"}, |
|
|
|
|
{"name": "Round logE"}, |
|
|
|
|
{"name": "Round log2"}, |
|
|
|
|
{"name": "Round log10"}, |
|
|
|
|
]}, |
|
|
|
|
]}, |
|
|
|
|
{"name": "Worst", |
|
|
|
|
"children": featuresQuad4, |
|
|
|
|
"lin_color": spaceSlice4 |
|
|
|
|
}, |
|
|
|
|
{"name": "All", |
|
|
|
|
"children": featuresQuad5, |
|
|
|
|
"lin_color": spaceSlice5 |
|
|
|
|
}, |
|
|
|
|
{"name": "Best", |
|
|
|
|
"children": featuresQuad1, |
|
|
|
|
"lin_color": spaceSlice1 |
|
|
|
|
}, |
|
|
|
|
{"name": "Good", |
|
|
|
|
"children": featuresQuad2, |
|
|
|
|
"lin_color": spaceSlice2 |
|
|
|
|
}, |
|
|
|
|
{"name": "Bad", |
|
|
|
|
"children": featuresQuad3, |
|
|
|
|
"lin_color": spaceSlice3 |
|
|
|
|
}, |
|
|
|
|
] |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var DURATION = 700; // d3 animation duration |
|
|
|
|
var STAGGERN = 4; // delay for each node |
|
|
|
|
var STAGGERD = 200; // delay for each depth |
|
|
|
@ -222,7 +178,7 @@ export default { |
|
|
|
|
var MIN_ZOOM = 0.5; // minimum zoom allowed |
|
|
|
|
var MAX_ZOOM = 10; // maximum zoom allowed |
|
|
|
|
var HAS_CHILDREN_COLOR = 'lightsteelblue'; |
|
|
|
|
var SELECTED_COLOR = '#a00'; // color of selected node |
|
|
|
|
var SELECTED_COLOR = 'yellow'; // color of selected node |
|
|
|
|
var ZOOM_INC = 0.04; // zoom factor per animation frame |
|
|
|
|
var PAN_INC = 3; // pan per animation frame |
|
|
|
|
var ROT_INC = 0.3; // rotation per animation frame |
|
|
|
@ -295,7 +251,7 @@ export default { |
|
|
|
|
var root = treeData; |
|
|
|
|
root.x0 = curY; |
|
|
|
|
root.y0 = 0; |
|
|
|
|
selectNode(root); // current selected node |
|
|
|
|
selectNode(treeData.children[1]); // current selected node |
|
|
|
|
|
|
|
|
|
// Collapse all children of root's children before rendering |
|
|
|
|
// if (root.children) { |
|
|
|
@ -305,7 +261,7 @@ export default { |
|
|
|
|
// } |
|
|
|
|
|
|
|
|
|
update(root, true); // Layout the tree initially and center on the root node |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// update the tree |
|
|
|
|
// source - source node of the update |
|
|
|
|
// transition - whether to do a transition |
|
|
|
@ -335,9 +291,13 @@ export default { |
|
|
|
|
var nodeEnter = node.enter().insert('g', ':first-child') |
|
|
|
|
.attr('class', 'node') |
|
|
|
|
.attr('transform', 'rotate(' + (source.x0 - 90) + ')translate(' + source.y0 + ')') |
|
|
|
|
.on('click', click).on('dblclick', dblclick).on('contextmenu', showContextMenu); |
|
|
|
|
.on('click', click) |
|
|
|
|
.on('dblclick', dblclick) |
|
|
|
|
.on('contextmenu', showContextMenu); |
|
|
|
|
// .on('mousedown', suppress); |
|
|
|
|
|
|
|
|
|
//d3.select('#some-id').dispatch('click'); |
|
|
|
|
|
|
|
|
|
nodeEnter.append('circle') |
|
|
|
|
.attr('r', 1e-6) |
|
|
|
|
.style('fill', function(d) { |
|
|
|
@ -363,11 +323,25 @@ export default { |
|
|
|
|
node.select('circle') |
|
|
|
|
.attr('r', NODE_DIAMETER * reduceZ()) |
|
|
|
|
.style('fill', function(d) { |
|
|
|
|
return d._children ? HAS_CHILDREN_COLOR : 'white'; |
|
|
|
|
if(d.name == 'Data') { |
|
|
|
|
return d._children ? 'white' : 'white'; |
|
|
|
|
} else { |
|
|
|
|
return d._children ? HAS_CHILDREN_COLOR : '#D3D3D3'; |
|
|
|
|
} |
|
|
|
|
}).attr('stroke', function(d) { |
|
|
|
|
return d.selected ? SELECTED_COLOR : 'steelblue'; |
|
|
|
|
if(d.name == 'Data') { |
|
|
|
|
return d.selected ? SELECTED_COLOR : 'white'; |
|
|
|
|
} else { |
|
|
|
|
return d.selected ? SELECTED_COLOR : 'black'; |
|
|
|
|
} |
|
|
|
|
}).attr('stroke-width', function(d) { |
|
|
|
|
return d.selected ? 3 : 1.5; |
|
|
|
|
if(d.name == 'Data') { |
|
|
|
|
return d.selected ? 0 : 0; |
|
|
|
|
} else if (d.name == 'All' || d.name == 'Best' || d.name == 'Good' || d.name == 'Bad' || d.name == 'Worst'){ |
|
|
|
|
return d.selected ? 2 : 2; |
|
|
|
|
} else { |
|
|
|
|
return d.selected ? 0 : 0; |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
node.select('text') |
|
|
|
@ -379,7 +353,7 @@ export default { |
|
|
|
|
'rotate(180)translate(-8)scale(' |
|
|
|
|
) + reduceZ() +')'; |
|
|
|
|
}).attr('fill', function(d) { |
|
|
|
|
return d.selected ? SELECTED_COLOR : 'black'; |
|
|
|
|
return d.selected ? 'black' : 'black'; |
|
|
|
|
}).attr('dy', '.35em'); |
|
|
|
|
|
|
|
|
|
var nodeUpdate = node.transition().duration(duration) |
|
|
|
@ -428,7 +402,15 @@ export default { |
|
|
|
|
source: o, |
|
|
|
|
target: o |
|
|
|
|
}); |
|
|
|
|
}); |
|
|
|
|
}).style("stroke", function(d){ |
|
|
|
|
if (d.target.lin_color > 0) { |
|
|
|
|
return '#33a02c' |
|
|
|
|
} else if (d.target.lin_color < 0) { |
|
|
|
|
return '#e31a1c' |
|
|
|
|
} else { |
|
|
|
|
return '#D3D3D3' |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
// Transition links to their new position |
|
|
|
|
link.transition().duration(duration) |
|
|
|
@ -596,6 +578,19 @@ export default { |
|
|
|
|
d3.event.preventDefault(); |
|
|
|
|
selectNode(d); |
|
|
|
|
update(d); |
|
|
|
|
var sendSliceID = 4 |
|
|
|
|
if (d.name == "Best") { |
|
|
|
|
sendSliceID = 0 |
|
|
|
|
} else if (d.name == "Good") { |
|
|
|
|
sendSliceID = 1 |
|
|
|
|
} else if (d.name == "Bad") { |
|
|
|
|
sendSliceID = 2 |
|
|
|
|
} else if (d.name == "Worst") { |
|
|
|
|
sendSliceID = 3 |
|
|
|
|
} else { |
|
|
|
|
sendSliceID = 4 |
|
|
|
|
} |
|
|
|
|
EventBus.$emit('updateSlice', sendSliceID) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function dblclick(d) { // Toggle children of node |
|
|
|
@ -900,7 +895,8 @@ export default { |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
mounted () { |
|
|
|
|
this.radialTree() |
|
|
|
|
EventBus.$on('overviewCall', data => { this.colorsReceive = data }) |
|
|
|
|
EventBus.$on('overviewCall', this.initializeRadialTree) |
|
|
|
|
EventBus.$on('reset', this.reset) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -1041,8 +1037,7 @@ svg { |
|
|
|
|
} |
|
|
|
|
.link { |
|
|
|
|
fill: none; |
|
|
|
|
stroke: #ccc; |
|
|
|
|
stroke-width: 1.5px; |
|
|
|
|
stroke: #D3D3D3; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
</style> |