parent
585efcbb63
commit
ff669e8f56
Binary file not shown.
@ -1,117 +0,0 @@ |
|||||||
<template> |
|
||||||
<div id="myDynamicTable" v-on:change="this.getFeatureSelection"></div> |
|
||||||
</template> |
|
||||||
|
|
||||||
<script> |
|
||||||
import { EventBus } from '../main.js' |
|
||||||
|
|
||||||
export default { |
|
||||||
name: 'FeatureSelection', |
|
||||||
data () { |
|
||||||
return { |
|
||||||
GetResults: '', |
|
||||||
datafromCheckbox: '', |
|
||||||
loop: 0 |
|
||||||
} |
|
||||||
}, |
|
||||||
methods: { |
|
||||||
FeatureSelection () { |
|
||||||
|
|
||||||
document.getElementById("myDynamicTable").innerHTML = ""; |
|
||||||
let Features= JSON.parse(this.GetResults[7]) |
|
||||||
let ClassifierswithoutFI = JSON.parse(this.GetResults[8]) |
|
||||||
let ClassifierswithFI = JSON.parse(this.GetResults[9]) |
|
||||||
const limit = JSON.parse(this.GetResults[13]) |
|
||||||
var Classifiers |
|
||||||
Classifiers = ClassifierswithoutFI.concat(ClassifierswithFI) |
|
||||||
var limitList = [] |
|
||||||
if (limit == '') { |
|
||||||
for (let i = 0; i < Classifiers.length; i++) { |
|
||||||
limitList.push(Classifiers[i]) |
|
||||||
} |
|
||||||
} else { |
|
||||||
limitList = [] |
|
||||||
for (let i = 0; i < limit.length; i++) { |
|
||||||
for (let j = 0; j < Classifiers.length; j++) { |
|
||||||
if (Number(limit[i].match(/\d+/)[0]) == Classifiers[j]) { |
|
||||||
limitList.push(Number(limit[i].match(/\d+/)[0])) |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
var myTableDiv = document.getElementById("myDynamicTable"); |
|
||||||
var table = document.createElement('TABLE'); |
|
||||||
table.border = '1'; |
|
||||||
|
|
||||||
var tableBody = document.createElement('TBODY'); |
|
||||||
table.appendChild(tableBody); |
|
||||||
|
|
||||||
var checkBoxArray = [] |
|
||||||
for (var i = 0; i < limitList.length+1; i++) { |
|
||||||
var tr = document.createElement('TR'); |
|
||||||
tableBody.appendChild(tr); |
|
||||||
for (var j = 0; j < Features.length; j++) { |
|
||||||
if (j == 0){ |
|
||||||
if (i == 0) { |
|
||||||
var td = document.createElement('TD'); |
|
||||||
td.width = '75'; |
|
||||||
td.appendChild(document.createTextNode('')); |
|
||||||
tr.appendChild(td); |
|
||||||
} else { |
|
||||||
var td = document.createElement('TD'); |
|
||||||
td.width = '90'; |
|
||||||
td.appendChild(document.createTextNode('M ' + (i - 1))); |
|
||||||
tr.appendChild(td); |
|
||||||
} |
|
||||||
} |
|
||||||
if (i == 0){ |
|
||||||
var td = document.createElement('TD'); |
|
||||||
td.width = '30'; |
|
||||||
td.appendChild(document.createTextNode('F ' + j)); |
|
||||||
tr.appendChild(td); |
|
||||||
} else { |
|
||||||
var checkbox = document.createElement('input'); |
|
||||||
checkbox.type = "checkbox"; |
|
||||||
checkbox.checked = true; |
|
||||||
checkbox.name = i-1; |
|
||||||
checkbox.text = "F " + j |
|
||||||
checkbox.value = "value"; |
|
||||||
checkbox.id = "M " + (i-1) + ", F " + j; |
|
||||||
checkBoxArray.push(checkbox) |
|
||||||
var td = document.createElement('TD'); |
|
||||||
td.appendChild(myTableDiv.appendChild(checkbox)); |
|
||||||
tr.appendChild(td); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
} |
|
||||||
//if (this.loop == 0) { |
|
||||||
myTableDiv.appendChild(table); |
|
||||||
//} |
|
||||||
this.loop++ |
|
||||||
this.datafromCheckbox = checkBoxArray |
|
||||||
}, |
|
||||||
getFeatureSelection () { |
|
||||||
|
|
||||||
var results = new Array() |
|
||||||
this.datafromCheckbox.forEach(eachCheckbox => { |
|
||||||
if (eachCheckbox.checked == true) { |
|
||||||
results.push('ClassifierID: ' + eachCheckbox.name, 'FeatureName: ' + eachCheckbox.text, 'Check: 1') |
|
||||||
} |
|
||||||
else { |
|
||||||
results.push('ClassifierID: ' + eachCheckbox.name, 'FeatureName: ' + eachCheckbox.text, 'Check: 0') |
|
||||||
} |
|
||||||
}); |
|
||||||
EventBus.$emit('SendSelectedFeaturesEvent', results) |
|
||||||
}, |
|
||||||
reset () { |
|
||||||
document.getElementById("myDynamicTable").innerHTML = ""; |
|
||||||
} |
|
||||||
}, |
|
||||||
mounted () { |
|
||||||
EventBus.$on('emittedEventCallingTableView', data => { this.GetResults = data }) |
|
||||||
EventBus.$on('emittedEventCallingTableView', this.FeatureSelection) |
|
||||||
EventBus.$on('resetViews', this.reset) |
|
||||||
} |
|
||||||
} |
|
||||||
</script> |
|
@ -1,581 +0,0 @@ |
|||||||
<template> |
|
||||||
<div id="chart"></div> |
|
||||||
</template> |
|
||||||
|
|
||||||
<script> |
|
||||||
import * as d3Base from 'd3' |
|
||||||
import { loom, string } from 'd3-loom' |
|
||||||
import { EventBus } from '../main.js' |
|
||||||
|
|
||||||
// attach all d3 plugins to the d3 library |
|
||||||
const d3 = Object.assign(d3Base, { loom, string }) |
|
||||||
|
|
||||||
export default { |
|
||||||
name: "StretchedChord", |
|
||||||
data () { |
|
||||||
return { |
|
||||||
AllResults: 0 |
|
||||||
} |
|
||||||
}, |
|
||||||
methods: { |
|
||||||
StretchChord () { |
|
||||||
d3.selectAll("#chart > *").remove(); |
|
||||||
const FeatureImportance = JSON.parse(this.AllResults[3]) |
|
||||||
const ClassNames = JSON.parse(this.AllResults[5]) |
|
||||||
const ClassifiersIDs = JSON.parse(this.AllResults[9]) |
|
||||||
const limit = JSON.parse(this.AllResults[13]) |
|
||||||
var limitList = [] |
|
||||||
if (limit == '') { |
|
||||||
for (let i = 0; i < ClassifiersIDs.length; i++) { |
|
||||||
limitList.push(ClassifiersIDs[i]) |
|
||||||
} |
|
||||||
} else { |
|
||||||
limitList = [] |
|
||||||
for (let i = 0; i < limit.length; i++) { |
|
||||||
for (let j = 0; j < ClassifiersIDs.length; j++) { |
|
||||||
if (Number(limit[i].match(/\d+/)[0]) == ClassifiersIDs[j]) { |
|
||||||
limitList.push(Number(limit[i].match(/\d+/)[0])) |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
if (limitList.length != 0){ |
|
||||||
var SortFeaturesPerClass = [] |
|
||||||
var MergeSortFeaturesPerClass = [] |
|
||||||
var counter = 0 |
|
||||||
var SortFeaturesPerClassRemoveEmpty = [] |
|
||||||
var returnvalue = 0 |
|
||||||
FeatureImportance.forEach(classifier => { |
|
||||||
for (let i = 0; i < limitList.length; i++) { |
|
||||||
returnvalue = this.sortObject(classifier[i], limitList[counter], ClassNames[i]) |
|
||||||
if (returnvalue === undefined || returnvalue.length == 0) { |
|
||||||
} else { |
|
||||||
if (returnvalue[0]['classifier'] != 'M undefined') { |
|
||||||
SortFeaturesPerClass.push(returnvalue) |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
counter++ |
|
||||||
}) |
|
||||||
//var SortFeaturesPerClassRemoveEmpty = SortFeaturesPerClass.filter(e => e.length); |
|
||||||
MergeSortFeaturesPerClass = SortFeaturesPerClass[0] |
|
||||||
for (let i = 0; i < SortFeaturesPerClass.length - 1; i++) { |
|
||||||
MergeSortFeaturesPerClass = MergeSortFeaturesPerClass.concat(SortFeaturesPerClass[i+1]) |
|
||||||
} |
|
||||||
var margin = {left:60, top:40, right:80, bottom:50}, |
|
||||||
width = Math.max( Math.min(window.innerWidth, 500) - margin.left - margin.right - 20, 10), |
|
||||||
height = Math.max( Math.min(window.innerHeight - 250, 700) - margin.top - margin.bottom - 20, 10), |
|
||||||
innerRadius = Math.min(width * 0.33, height * .45), |
|
||||||
outerRadius = innerRadius * 1.05; |
|
||||||
|
|
||||||
//Recalculate the width and height now that we know the radius |
|
||||||
width = outerRadius * 2 + margin.right + margin.left; |
|
||||||
height = outerRadius * 2 + margin.top + margin.bottom; |
|
||||||
|
|
||||||
//Reset the overall font size |
|
||||||
var newFontSize = Math.min(70, Math.max(40, innerRadius * 62.5 / 250)); |
|
||||||
d3.select("html").style("font-size", newFontSize + "%"); |
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
////////////////// Set-up Chord parameters ///////////////// |
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
|
|
||||||
var pullOutSize = 20 + 30/135 * innerRadius; |
|
||||||
var numFormat = d3.format(",.0f"); |
|
||||||
var defaultOpacity = 0.85, |
|
||||||
fadeOpacity = 0.075; |
|
||||||
|
|
||||||
var loom = d3.loom() |
|
||||||
.padAngle(0.05) |
|
||||||
//.sortSubgroups(sortCharacter) |
|
||||||
//.heightInner(0) |
|
||||||
//.sortGroups(function(d) { return d.words }) |
|
||||||
//.sortLooms(d3.descending) |
|
||||||
.emptyPerc(0) |
|
||||||
.widthInner(40) |
|
||||||
//.widthInner(function(d) { return 6 * d.length; }) |
|
||||||
.value(function(d) { return d.importancerate; }) |
|
||||||
.outercolorfun(function(d) { return d.class; }) |
|
||||||
.inner(function(d) { return d.feature; }) |
|
||||||
.outer(function(d) { return d.classifier; }); |
|
||||||
|
|
||||||
var arc = d3.arc() |
|
||||||
.innerRadius(innerRadius*1.01) |
|
||||||
.outerRadius(outerRadius); |
|
||||||
|
|
||||||
var string = d3.string() |
|
||||||
.radius(innerRadius) |
|
||||||
.pullout(pullOutSize); |
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
////////////////////// Create SVG ////////////////////////// |
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
|
|
||||||
d3.select("#chart").selectAll("*").remove(); |
|
||||||
|
|
||||||
var svg = d3.select("#chart").append("svg") |
|
||||||
.attr("width", width + margin.left + margin.right) |
|
||||||
.attr("height", height + margin.top + margin.bottom); |
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
///////////////////// Read in data ///////////////////////// |
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
///////////////////// Prepare the data ///////////////////// |
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
|
|
||||||
//Sort the inner characters based on the total number of words spoken |
|
||||||
var dataAgg = MergeSortFeaturesPerClass |
|
||||||
|
|
||||||
//Find the total number of words per character |
|
||||||
var dataChar = d3.nest() |
|
||||||
.key(function(d) { return d.character; }) |
|
||||||
.rollup(function(leaves) { return d3.sum(leaves, function(d) { return d.words; }); }) |
|
||||||
.entries(dataAgg) |
|
||||||
.sort(function(a, b){ return d3.descending(a.value, b.value); }); |
|
||||||
//Unflatten the result |
|
||||||
var characterOrder = dataChar.map(function(d) { return d.key }) |
|
||||||
//Sort the characters on a specific order |
|
||||||
function sortCharacter(a, b) { |
|
||||||
return characterOrder.indexOf(a) - characterOrder.indexOf(b) |
|
||||||
}//sortCharacter |
|
||||||
|
|
||||||
//Set more loom functions |
|
||||||
loom |
|
||||||
.sortSubgroups(sortCharacter) |
|
||||||
.heightInner(innerRadius*0.2/characterOrder.length) |
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
///////////////////////// Colors /////////////////////////// |
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
|
|
||||||
var categories = ClassNames |
|
||||||
var colors = ["#0000FF", "#ff0000", "#00ff00"] |
|
||||||
var color = d3.scaleOrdinal() |
|
||||||
.domain(categories) |
|
||||||
.range(colors) |
|
||||||
|
|
||||||
//Create a group that already holds the data |
|
||||||
var g = svg.append("g") |
|
||||||
.attr("transform", "translate(" + (width/2 + margin.left) + "," + (height/2 + margin.top) + ")") |
|
||||||
.datum(loom(dataAgg)) |
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
///////////////////// Set-up title ///////////////////////// |
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
|
|
||||||
var titles = g.append("g") |
|
||||||
.attr("class", "texts") |
|
||||||
.style("opacity", 0) |
|
||||||
|
|
||||||
titles.append("text") |
|
||||||
.attr("class", "name-title") |
|
||||||
.attr("x", 0) |
|
||||||
.attr("y", -innerRadius*5/6) |
|
||||||
|
|
||||||
titles.append("text") |
|
||||||
.attr("class", "value-title") |
|
||||||
.attr("x", 0) |
|
||||||
.attr("y", -innerRadius*5/6 + 25) |
|
||||||
|
|
||||||
//The character pieces |
|
||||||
titles.append("text") |
|
||||||
.attr("class", "character-note") |
|
||||||
.attr("x", 0) |
|
||||||
.attr("y", innerRadius/2) |
|
||||||
.attr("dy", "0.35em") |
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
////////////////////// Draw outer arcs ///////////////////// |
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
|
|
||||||
var arcs = g.append("g") |
|
||||||
.attr("class", "arcs") |
|
||||||
.selectAll("g") |
|
||||||
.data(function(s) { |
|
||||||
return s.groups |
|
||||||
}) |
|
||||||
.enter().append("g") |
|
||||||
.attr("class", "arc-wrapper") |
|
||||||
.each(function(d) { |
|
||||||
d.pullOutSize = (pullOutSize * ( d.startAngle > Math.PI + 1e-2 ? -1 : 1)) |
|
||||||
}) |
|
||||||
.on("mouseover", function(d) { |
|
||||||
|
|
||||||
//Hide all other arcs |
|
||||||
d3.selectAll(".arc-wrapper") |
|
||||||
.transition() |
|
||||||
.style("opacity", function(s) { return s.outername === d.outername ? 1 : 0.5 }) |
|
||||||
|
|
||||||
//Hide all other strings |
|
||||||
d3.selectAll(".string") |
|
||||||
.transition() |
|
||||||
.style("opacity", function(s) { return s.outer.outername === d.outername ? 1 : fadeOpacity }) |
|
||||||
|
|
||||||
//Find the data for the strings of the hovered over location |
|
||||||
var locationData = loom(dataAgg).filter(function(s) { return s.outer.outername === d.outername }) |
|
||||||
//Hide the characters who haven't said a word |
|
||||||
d3.selectAll(".inner-label") |
|
||||||
.transition() |
|
||||||
.style("opacity", function(s) { |
|
||||||
//Find out how many words the character said at the hovered over location |
|
||||||
var char = locationData.filter(function(c) { return c.outer.innername === s.name }) |
|
||||||
return char.length === 0 ? 0.1 : 1 |
|
||||||
}) |
|
||||||
}) |
|
||||||
.on("mouseout", function(d) { |
|
||||||
|
|
||||||
//Sjow all arc labels |
|
||||||
d3.selectAll(".arc-wrapper") |
|
||||||
.transition() |
|
||||||
.style("opacity", 1) |
|
||||||
|
|
||||||
//Show all strings again |
|
||||||
d3.selectAll(".string") |
|
||||||
.transition() |
|
||||||
.style("opacity", defaultOpacity) |
|
||||||
|
|
||||||
//Show all characters again |
|
||||||
d3.selectAll(".inner-label") |
|
||||||
.transition() |
|
||||||
.style("opacity", 1) |
|
||||||
}) |
|
||||||
|
|
||||||
var outerArcs = arcs.append("path") |
|
||||||
.attr("class", "arc") |
|
||||||
//.style("fill", function(d) { return color(d.outer.innername) }) |
|
||||||
.attr("d", arc) |
|
||||||
.attr("transform", function(d, i) { //Pull the two slices apart |
|
||||||
return "translate(" + d.pullOutSize + ',' + 0 + ")" |
|
||||||
}) |
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
//////////////////// Draw outer labels ///////////////////// |
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
|
|
||||||
//The text needs to be rotated with the offset in the clockwise direction |
|
||||||
var outerLabels = arcs.append("g") |
|
||||||
.each(function(d) { d.angle = ((d.startAngle + d.endAngle) / 2) }) |
|
||||||
.attr("class", "outer-labels") |
|
||||||
.attr("text-anchor", function(d) { return d.angle > Math.PI ? "end" : null }) |
|
||||||
.attr("transform", function(d,i) { |
|
||||||
var c = arc.centroid(d) |
|
||||||
return "translate(" + (c[0] + d.pullOutSize) + "," + c[1] + ")" |
|
||||||
+ "rotate(" + (d.angle * 180 / Math.PI - 90) + ")" |
|
||||||
+ "translate(" + 26 + ",0)" |
|
||||||
+ (d.angle > Math.PI ? "rotate(180)" : "") |
|
||||||
}) |
|
||||||
|
|
||||||
//The outer name |
|
||||||
outerLabels.append("text") |
|
||||||
.attr("class", "outer-label") |
|
||||||
.attr("dy", ".35em") |
|
||||||
.text(function(d,i){ return d.outername }) |
|
||||||
|
|
||||||
//The value below it |
|
||||||
outerLabels.append("text") |
|
||||||
.attr("class", "outer-label-value") |
|
||||||
.attr("dy", "1.5em") |
|
||||||
.text(function(d,i){ return 'Rel.:' + numFormat(d.value) + '%'}) |
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
////////////////// Draw inner strings ////////////////////// |
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
|
|
||||||
var strings = g.append("g") |
|
||||||
.attr("class", "stringWrapper") |
|
||||||
.style("isolation", "isolate") |
|
||||||
.selectAll("path") |
|
||||||
.data(function(strings) { |
|
||||||
return strings |
|
||||||
}) |
|
||||||
.enter().append("path") |
|
||||||
.attr("class", "string") |
|
||||||
.style("mix-blend-mode", "multiply") |
|
||||||
.attr("d", string) |
|
||||||
.style("fill", function(d) { |
|
||||||
return d3.rgb( color(d.outer.outercolor) ).brighter(0.2) |
|
||||||
}) |
|
||||||
.style("opacity", defaultOpacity) |
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
//////////////////// Draw inner labels ///////////////////// |
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
|
|
||||||
//The text also needs to be displaced in the horizontal directions |
|
||||||
//And also rotated with the offset in the clockwise direction |
|
||||||
var innerLabels = g.append("g") |
|
||||||
.attr("class","inner-labels") |
|
||||||
.selectAll("text") |
|
||||||
.data(function(s) { |
|
||||||
return s.innergroups |
|
||||||
}) |
|
||||||
.enter().append("text") |
|
||||||
.attr("class", "inner-label") |
|
||||||
.attr("x", function(d,i) { return d.x }) |
|
||||||
.attr("y", function(d,i) { return d.y }) |
|
||||||
.style("text-anchor", "middle") |
|
||||||
.attr("dy", ".35em") |
|
||||||
.text(function(d,i) { return d.name }) |
|
||||||
.on("mouseover", function(d) { |
|
||||||
|
|
||||||
//Show all the strings of the highlighted character and hide all else |
|
||||||
d3.selectAll(".string") |
|
||||||
.transition() |
|
||||||
.style("opacity", function(s) { |
|
||||||
return s.outer.innername !== d.name ? fadeOpacity : 1 |
|
||||||
}) |
|
||||||
|
|
||||||
//Update the word count of the outer labels |
|
||||||
var characterData = loom(dataAgg).filter(function(s) { return s.outer.innername === d.name }) |
|
||||||
d3.selectAll(".outer-label-value") |
|
||||||
.text(function(s,i){ |
|
||||||
//Find which characterData is the correct one based on location |
|
||||||
var loc = characterData.filter(function(c) { return c.outer.outername === s.outername }) |
|
||||||
if(loc.length === 0) { |
|
||||||
var value = 0 |
|
||||||
} else { |
|
||||||
var value = loc[0].outer.value |
|
||||||
} |
|
||||||
return numFormat(value) + (value === 1 ? " Imp." : " Imp.") |
|
||||||
|
|
||||||
}) |
|
||||||
|
|
||||||
//Hide the arc where the character hasn't said a thing |
|
||||||
d3.selectAll(".arc-wrapper") |
|
||||||
.transition() |
|
||||||
.style("opacity", function(s) { |
|
||||||
//Find which characterData is the correct one based on location |
|
||||||
var loc = characterData.filter(function(c) { return c.outer.outername === s.outername }) |
|
||||||
return loc.length === 0 ? 0.1 : 1 |
|
||||||
}) |
|
||||||
|
|
||||||
|
|
||||||
}) |
|
||||||
.on("mouseout", function(d) { |
|
||||||
|
|
||||||
//Put the string opacity back to normal |
|
||||||
d3.selectAll(".string") |
|
||||||
.transition() |
|
||||||
.style("opacity", defaultOpacity) |
|
||||||
|
|
||||||
//Return the word count to what it was |
|
||||||
d3.selectAll(".outer-label-value") |
|
||||||
.text(function(s,i){ return 'Imp.: ' + numFormat(s.value) }) |
|
||||||
|
|
||||||
//Show all arcs again |
|
||||||
d3.selectAll(".arc-wrapper") |
|
||||||
.transition() |
|
||||||
.style("opacity", 1) |
|
||||||
|
|
||||||
//Hide the title |
|
||||||
d3.selectAll(".texts") |
|
||||||
.transition() |
|
||||||
.style("opacity", 0) |
|
||||||
|
|
||||||
}) |
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
///////////////////// Extra functions ////////////////////// |
|
||||||
//////////////////////////////////////////////////////////// |
|
||||||
|
|
||||||
//Sort alphabetically |
|
||||||
function sortAlpha(a, b){ |
|
||||||
if(a < b) return -1 |
|
||||||
if(a > b) return 1 |
|
||||||
return 0 |
|
||||||
}//sortAlpha |
|
||||||
|
|
||||||
//Sort on the number of words |
|
||||||
function sortWords(a, b){ |
|
||||||
if(a.words < b.words) return -1 |
|
||||||
if(a.words > b.words) return 1 |
|
||||||
return 0 |
|
||||||
}//sortWords |
|
||||||
|
|
||||||
/*Taken from http://bl.ocks.org/mbostock/7555321 |
|
||||||
//Wraps SVG text*/ |
|
||||||
function wrap(text, width) { |
|
||||||
text.each(function() { |
|
||||||
var text = d3.select(this), |
|
||||||
words = text.text().split(/\s+/).reverse(), |
|
||||||
word, |
|
||||||
line = [], |
|
||||||
lineNumber = 0, |
|
||||||
lineHeight = 1.2, // ems |
|
||||||
y = parseFloat(text.attr("y")), |
|
||||||
x = parseFloat(text.attr("x")), |
|
||||||
dy = parseFloat(text.attr("dy")), |
|
||||||
tspan = text.text(null).append("tspan").attr("x", x).attr("y", y).attr("dy", dy + "em") |
|
||||||
|
|
||||||
while (word = words.pop()) { |
|
||||||
line.push(word) |
|
||||||
tspan.text(line.join(" ")) |
|
||||||
if (tspan.node().getComputedTextLength() > width) { |
|
||||||
line.pop() |
|
||||||
tspan.text(line.join(" ")) |
|
||||||
line = [word] |
|
||||||
tspan = text.append("tspan").attr("x", x).attr("y", y).attr("dy", ++lineNumber * lineHeight + dy + "em").text(word) |
|
||||||
} |
|
||||||
} |
|
||||||
}) |
|
||||||
}//wrap |
|
||||||
} |
|
||||||
}, |
|
||||||
sortObject (obj, classifierID, ClassName) { |
|
||||||
var arr = [] |
|
||||||
for (var prop in obj) { |
|
||||||
if (Object.prototype.hasOwnProperty.call(obj, prop)) { |
|
||||||
//if ((this.LimitFeatureImportance/100) < Math.abs(obj[prop])) { |
|
||||||
arr.push({ |
|
||||||
'feature': 'F ' + prop, |
|
||||||
'classifier': 'M ' + classifierID, |
|
||||||
'class': ClassName, |
|
||||||
'importancerate': Math.abs(Math.round(obj[prop] * 100)) |
|
||||||
}) |
|
||||||
//} |
|
||||||
} |
|
||||||
} |
|
||||||
arr = arr.sort(function (a, b) { return Math.abs(b.ImportanceValue - a.ImportanceValue) }) |
|
||||||
return arr |
|
||||||
}, |
|
||||||
ObjectSize (obj) { |
|
||||||
let size = 0 |
|
||||||
let key |
|
||||||
for (key in obj) { |
|
||||||
if (Object.prototype.hasOwnProperty.call(obj, key)) size++ |
|
||||||
} |
|
||||||
return size |
|
||||||
}, |
|
||||||
reset () { |
|
||||||
d3.selectAll("#chart > *").remove(); |
|
||||||
} |
|
||||||
}, |
|
||||||
mounted () { |
|
||||||
EventBus.$on('emittedEventCallingChordView', data => { this.AllResults = data }) |
|
||||||
EventBus.$on('emittedEventCallingChordView', this.StretchChord) |
|
||||||
EventBus.$emit('resetViews', this.reset) |
|
||||||
} |
|
||||||
} |
|
||||||
</script> |
|
||||||
|
|
||||||
<!-- Add "scoped" attribute to limit CSS to this component only --> |
|
||||||
<style scoped> |
|
||||||
html { font-size: 62.5%; } |
|
||||||
|
|
||||||
body { |
|
||||||
font-family: 'Cormorant', serif; |
|
||||||
font-size: 1.2rem; |
|
||||||
fill: #b9b9b9; |
|
||||||
} |
|
||||||
|
|
||||||
.lotr-content-wrapper { |
|
||||||
max-width: 900px; |
|
||||||
margin: 0 auto; |
|
||||||
} |
|
||||||
|
|
||||||
#lotr-title { |
|
||||||
font-size: 42px; |
|
||||||
font-weight: 300; |
|
||||||
margin: 40px 30px 0px 30px; |
|
||||||
color: #272727; |
|
||||||
} |
|
||||||
|
|
||||||
#lotr-subtitle { |
|
||||||
font-size: 14px; |
|
||||||
color: #b1b1b1; |
|
||||||
margin: 0px 30px 20px 30px; |
|
||||||
font-weight: 300; |
|
||||||
} |
|
||||||
|
|
||||||
#lotr-intro { |
|
||||||
font-size: 16px; |
|
||||||
margin: 0px 30px 10px 30px; |
|
||||||
max-width: 800px; |
|
||||||
} |
|
||||||
|
|
||||||
#lotr-note { |
|
||||||
font-size: 14px; |
|
||||||
margin: 0px 30px 10px 30px; |
|
||||||
max-width: 800px; |
|
||||||
color: #b1b1b1; |
|
||||||
font-weight: 300; |
|
||||||
} |
|
||||||
|
|
||||||
#chart { |
|
||||||
text-align: center; |
|
||||||
} |
|
||||||
|
|
||||||
#lotr-credit { |
|
||||||
font-size: 14px; |
|
||||||
margin: 10px 30px 5px 30px; |
|
||||||
} |
|
||||||
|
|
||||||
#lotr-sources { |
|
||||||
font-size: 11px; |
|
||||||
max-width: 300px; |
|
||||||
margin: 15px 30px 5px 30px; |
|
||||||
color: #9e9e9e; |
|
||||||
font-weight: 300; |
|
||||||
padding-bottom: 20px; |
|
||||||
} |
|
||||||
|
|
||||||
a:hover { |
|
||||||
text-decoration: none; |
|
||||||
border-bottom: 1px solid black; |
|
||||||
} |
|
||||||
|
|
||||||
a, a:link, a:visited, a:active { |
|
||||||
text-decoration: none; |
|
||||||
color: black; |
|
||||||
border-bottom: 1px dotted rgba(0, 0, 0, .5); |
|
||||||
} |
|
||||||
|
|
||||||
.MiddleEarth { |
|
||||||
font-family: 'Macondo', cursive; |
|
||||||
color: #53821a; |
|
||||||
} |
|
||||||
|
|
||||||
/*--- chart ---*/ |
|
||||||
|
|
||||||
.name-title { |
|
||||||
font-family: 'Macondo Swash Caps', cursive; |
|
||||||
font-size: 2.8rem; |
|
||||||
fill: #232323; |
|
||||||
cursor: default; |
|
||||||
text-anchor: middle; |
|
||||||
} |
|
||||||
|
|
||||||
.value-title { |
|
||||||
text-anchor: middle; |
|
||||||
font-size: 1.8rem; |
|
||||||
fill: #b9b9b9; |
|
||||||
} |
|
||||||
|
|
||||||
.character-note { |
|
||||||
text-anchor: middle; |
|
||||||
font-size: 1.4rem; |
|
||||||
fill: #232323; |
|
||||||
} |
|
||||||
|
|
||||||
.inner-label { |
|
||||||
font-family: 'Macondo Swash Caps', cursive; |
|
||||||
font-size: 1.4rem; |
|
||||||
fill: #232323; |
|
||||||
cursor: default; |
|
||||||
} |
|
||||||
|
|
||||||
.outer-label { |
|
||||||
font-family: 'Macondo', cursive; |
|
||||||
font-size: 1.6rem; |
|
||||||
fill: #5f5f5f; |
|
||||||
cursor: default; |
|
||||||
} |
|
||||||
|
|
||||||
.outer-label-value { |
|
||||||
font-size: 1.2rem; |
|
||||||
fill: #b9b9b9; |
|
||||||
} |
|
||||||
|
|
||||||
</style> |
|
@ -0,0 +1,70 @@ |
|||||||
|
<template> |
||||||
|
<div> |
||||||
|
<div id="toggles" style="visibility:hidden"> |
||||||
|
Univariate Selection:<input type="checkbox" id="toggle-uni" data-toggle="toggle" checked="checked" data-on="Enabled" data-off="Disabled" data-size="small"> |
||||||
|
Permutation Importance:<input type="checkbox" id="toggle-per" data-toggle="toggle" checked="checked" data-on="Enabled" data-off="Disabled" data-size="small"> |
||||||
|
Feature Accuracy Importance:<input type="checkbox" id="toggle-fi" data-toggle="toggle" checked="checked" data-on="Enabled" data-off="Disabled" data-size="small"> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { EventBus } from '../main.js' |
||||||
|
import $ from 'jquery' |
||||||
|
import { bootstrapToggle } from 'bootstrap-toggle' |
||||||
|
import 'bootstrap-toggle/css/bootstrap-toggle.css' |
||||||
|
|
||||||
|
export default { |
||||||
|
name: 'ToggleSelection', |
||||||
|
data () { |
||||||
|
return { |
||||||
|
} |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
ToggleSelection () { |
||||||
|
}, |
||||||
|
ToggleShow () { |
||||||
|
document.getElementById('toggles').style.visibility = "visible" |
||||||
|
} |
||||||
|
}, |
||||||
|
mounted () { |
||||||
|
$('#toggle-uni').bootstrapToggle({ |
||||||
|
on: 'Enabled', |
||||||
|
off: 'Disabled' |
||||||
|
}); |
||||||
|
$('#toggle-uni').change(function() { |
||||||
|
var toggleID = document.getElementById('toggle-uni') |
||||||
|
if (toggleID.checked === false) { |
||||||
|
EventBus.$emit('toggle1', 0) |
||||||
|
} else { |
||||||
|
EventBus.$emit('toggle1', 1) |
||||||
|
} |
||||||
|
}) |
||||||
|
$('#toggle-per').bootstrapToggle({ |
||||||
|
on: 'Enabled', |
||||||
|
off: 'Disabled' |
||||||
|
}); |
||||||
|
$('#toggle-per').change(function() { |
||||||
|
var toggleID = document.getElementById('toggle-per') |
||||||
|
if (toggleID.checked === false) { |
||||||
|
EventBus.$emit('toggle2', 0) |
||||||
|
} else { |
||||||
|
EventBus.$emit('toggle2', 1) |
||||||
|
} |
||||||
|
}) |
||||||
|
$('#toggle-fi').bootstrapToggle({ |
||||||
|
on: 'Enabled', |
||||||
|
off: 'Disabled' |
||||||
|
}); |
||||||
|
$('#toggle-fi').change(function() { |
||||||
|
var toggleID = document.getElementById('toggle-fi') |
||||||
|
if (toggleID.checked === false) { |
||||||
|
EventBus.$emit('toggle3', 0) |
||||||
|
} else { |
||||||
|
EventBus.$emit('toggle3', 1) |
||||||
|
} |
||||||
|
}) |
||||||
|
EventBus.$on('emittedEventCallingToggles', this.ToggleShow) |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
Loading…
Reference in new issue