|
|
|
@ -36,7 +36,9 @@ export default { |
|
|
|
|
keyLocal: 0, |
|
|
|
|
activeModels: 0, |
|
|
|
|
flagLocal: false, |
|
|
|
|
smallScreenMode: '0px' |
|
|
|
|
smallScreenMode: '0px', |
|
|
|
|
dataFI: [], |
|
|
|
|
featureData: [], |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
methods: { |
|
|
|
@ -65,12 +67,69 @@ export default { |
|
|
|
|
// Clear Heatmap first |
|
|
|
|
var svg = d3.select("#Heatmap"); |
|
|
|
|
svg.selectAll("*").remove(); |
|
|
|
|
var featureUni = JSON.parse(this.dataFI[0]) |
|
|
|
|
|
|
|
|
|
var dataAll = {"columns":[["R","F1"],["R","F2"],["R","F2"],["R","F1&F2"],["R","F2&F3"],["R","F1&F3"],["R","F1&F2&F3"],["R","F1+F2"],["R","F2+F3"],["R","F1+F3"],["R","F1+F2+F3"],["R","F1-F2"],["R","F2-F3"],["R","F1-F3"],["R","F1-F2-F3"],["R","F1*F2"],["R","F2*F3"],["R","F1*F3"],["R","F1*F2*F3"],["R","F1/F2"],["R","F2/F3"],["R","F1/F3"],["R","F1/F2/F3"]],"index":[["Information Gain"],["Fisher-Score"],["Relative Risk"],["Odds Ratio"]],"data":[[0.1178,0.4834,0.1647,0.1633,0.3355,0.1353,0.0556,0.9388,0.9354,0.8548,0.7037,0.6092,0.3835,0.7285,0.6405,0.424,0.6935,0.5766,0.2275,0.8309,0.972,0.9439,0.9366],[0.0372,-0.09,0.5015,0.5663,0.5126,-0.0274,0.4304,0.9518,0.9499,0.9216,-0.0278,0.6516,0.3019,-0.0936,0.6597,0.2323,-0.0833,0.4921,0.122,0.9275,0.96095,0.955,0.9501],[0.378,0.5514,0.378,0.3929,0.3271,0.3816,0.3647,0.9303,0.9372,0.8356,0.5314,0.4069,0.4288,0.5496,0.4156,0.427,0.5299,0.3454,0.4511,0.88235,0.9705,0.9468,0.9405],[0.4988,0.4149,0.5952,0.0628,-0.1015,0.497,0.58,0.9531,0.9572,0.8494,0.6262,0.3854,0.6904,0.5711,0.346,0.5132,0.583,0.3917,0.5305,0.7074,0.9763,0.9632,0.9582]]} |
|
|
|
|
var algorithms = [] |
|
|
|
|
algorithms.push("Univariate FS") |
|
|
|
|
algorithms.push("Permutation FI") |
|
|
|
|
algorithms.push("Accuracy-based FI") |
|
|
|
|
algorithms.push("Average") |
|
|
|
|
algorithms.push("# Action #") |
|
|
|
|
|
|
|
|
|
var PermImpEli = JSON.parse(this.dataFI[1]) |
|
|
|
|
var FeaturesAccuracy = JSON.parse(this.dataFI[2]) |
|
|
|
|
var Features = this.featureData[0] |
|
|
|
|
|
|
|
|
|
var len2 = Features.length |
|
|
|
|
|
|
|
|
|
let arr = Object.values(featureUni.Score); |
|
|
|
|
let minUni = Math.min(...arr); |
|
|
|
|
let maxUni = Math.max(...arr); |
|
|
|
|
|
|
|
|
|
let len = algorithms.length |
|
|
|
|
let indicesYAxis = [] |
|
|
|
|
for (let i = 0; i < len+1; i++) { |
|
|
|
|
indicesYAxis[i] = [algorithms[i]] |
|
|
|
|
} |
|
|
|
|
let indicesXAxis = [] |
|
|
|
|
var temp = [] |
|
|
|
|
for (let i = 0; i < len2; i++) { |
|
|
|
|
temp = [] |
|
|
|
|
temp.push("R") |
|
|
|
|
var loop = i+1 |
|
|
|
|
temp.push(Features[i].toString()+" (F"+loop+")") |
|
|
|
|
indicesXAxis[i] = temp |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var values = [] |
|
|
|
|
var modelData = [] |
|
|
|
|
for (let j = 0; j < len2; j++) { |
|
|
|
|
var data = [] |
|
|
|
|
for (let i = 0; i <len; i++) { |
|
|
|
|
if (algorithms[i] == "Univariate FS") { |
|
|
|
|
values[i] = ((Object.values(featureUni.Score)[j]-minUni)/(maxUni-minUni)) |
|
|
|
|
} else if (algorithms[i] == "Permutation FI") { |
|
|
|
|
values[i] = PermImpEli[j][0] |
|
|
|
|
} else if (algorithms[i] == "Accuracy-based FI") { |
|
|
|
|
values[i] = FeaturesAccuracy[j][0] |
|
|
|
|
} else if (algorithms[i] == "Average") { |
|
|
|
|
values[i] = ((((Object.values(featureUni.Score)[j]-minUni)/(maxUni-minUni)))+(PermImpEli[j][0])+(FeaturesAccuracy[j][0]))/(len-2) |
|
|
|
|
} else { |
|
|
|
|
values[i] = -2 |
|
|
|
|
} |
|
|
|
|
data.push(values[i]) |
|
|
|
|
} |
|
|
|
|
modelData.push(data) |
|
|
|
|
} |
|
|
|
|
var transposedArray = [] |
|
|
|
|
transposedArray = modelData[0].map((col, i) => modelData.map(row => row[i])) |
|
|
|
|
|
|
|
|
|
var dataAll = {"columns":indicesXAxis,"index":indicesYAxis,"data":transposedArray} |
|
|
|
|
this.heatmap_display(dataAll, "#Heatmap"); |
|
|
|
|
|
|
|
|
|
}, |
|
|
|
|
heatmap_display(data, heatmapId) { |
|
|
|
|
var featuresAddRem = [] |
|
|
|
|
var cellSize = this.cellSize |
|
|
|
|
//########################################################################## |
|
|
|
|
// Patrick.Brockmann@lsce.ipsl.fr |
|
|
|
@ -226,8 +285,8 @@ export default { |
|
|
|
|
return d.idx; |
|
|
|
|
}) |
|
|
|
|
.attr("class", "row"); |
|
|
|
|
svg.append("text").attr("x", 150).attr("y", -40).text("Feature combination").style("font-size", "16px").attr("alignment-baseline","top") |
|
|
|
|
svg.append("text").attr("transform", "rotate(-90)").attr("x", -42).attr("y", -90).style("text-anchor", "middle").style("font-size", "16px").text("Algorithm"); // -130 before for HeartC |
|
|
|
|
svg.append("text").attr("x", 15).attr("y", -60).text("Feature").style("font-size", "16px").attr("alignment-baseline","top") |
|
|
|
|
svg.append("text").attr("transform", "rotate(-90)").attr("x", -52).attr("y", -90).style("text-anchor", "middle").style("font-size", "16px").text("Technique"); // -130 before for HeartC |
|
|
|
|
var heatMap = row.selectAll(".cell") |
|
|
|
|
.data(function(d) { |
|
|
|
|
return d; |
|
|
|
@ -260,61 +319,43 @@ export default { |
|
|
|
|
.attr("width", cellSize) |
|
|
|
|
.attr("height", cellSize) |
|
|
|
|
.style("fill", function(d) { |
|
|
|
|
if (d != null) return colorScale(d); |
|
|
|
|
else return "url(#diagonalHatch)"; |
|
|
|
|
if (d == -1) return "url(#diagonalHatch)" |
|
|
|
|
else if (d == -2) return "yellow" |
|
|
|
|
else return colorScale(d) |
|
|
|
|
}) |
|
|
|
|
.on('mouseover', function(d, i, j) { |
|
|
|
|
var k = Array.prototype.indexOf.call(j[i].parentNode.parentNode.childNodes,j[i].parentNode) - 3; |
|
|
|
|
d3.select('#colLabel_' + i).classed("hover", true); |
|
|
|
|
d3.select('#rowLabel_' + k).classed("hover", true); |
|
|
|
|
if (d != null) { |
|
|
|
|
tooltip.style("visibility", "visible"); |
|
|
|
|
tooltip.html('<div class="heatmap_tooltip">' + d.toFixed(2) + '</div>'); |
|
|
|
|
} else |
|
|
|
|
tooltip.style("visibility", "hidden"); |
|
|
|
|
|
|
|
|
|
}) |
|
|
|
|
.on('mouseout', function(d, i, j) { |
|
|
|
|
var k = Array.prototype.indexOf.call(j[i].parentNode.parentNode.childNodes,j[i].parentNode) - 3; |
|
|
|
|
d3.select('#colLabel_' + i).classed("hover", false); |
|
|
|
|
d3.select('#rowLabel_' + k).classed("hover", false); |
|
|
|
|
tooltip.style("visibility", "hidden"); |
|
|
|
|
|
|
|
|
|
}) |
|
|
|
|
.on("mousemove", function(d, i) { |
|
|
|
|
tooltip.style("top", (d3.mouse(this)[1] + 55) + "px").style("left", (d3.mouse(this)[0]) + "px"); |
|
|
|
|
}) |
|
|
|
|
.on('click', function(d, i, j) { |
|
|
|
|
var rowsExtracted = svg.selectAll(".row")._groups[0] |
|
|
|
|
var k = Array.prototype.indexOf.call(j[i].parentNode.parentNode.childNodes,j[i].parentNode) - 3; |
|
|
|
|
d3.select(this).style("fill", function(d) { |
|
|
|
|
if (d3.select(this).style("fill") === "url(\"#diagonalHatch\")"){ |
|
|
|
|
return colorScale(d) |
|
|
|
|
} else { |
|
|
|
|
return "url(#diagonalHatch)" |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
if (i+1 === j.length) { |
|
|
|
|
if(d3.select(this).style("fill") === "url(\"#diagonalHatch\")") { |
|
|
|
|
row.selectAll(".cr"+k).style("fill", "url(#diagonalHatch)") |
|
|
|
|
} else { |
|
|
|
|
row.selectAll(".cr"+k).style("fill", function(d) { |
|
|
|
|
return colorScale(d) |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
var finalresults = [] |
|
|
|
|
for (let i = 0; i < rowsExtracted[0].childNodes.length - 1; i++) { |
|
|
|
|
var results = [] |
|
|
|
|
for (let j = 0; j < rowsExtracted.length; j++) { |
|
|
|
|
if (rowsExtracted[j].childNodes[i].style.fill === "url(\"#diagonalHatch\")") { |
|
|
|
|
} else { |
|
|
|
|
results.push(j) |
|
|
|
|
if (d3.select(this).style("fill") === "yellow" || d3.select(this).style("fill") === "url(\"#diagonalHatch\")") { |
|
|
|
|
if (d3.select(this).style("fill") === "url(\"#diagonalHatch\")"){ |
|
|
|
|
if (d == -2) { |
|
|
|
|
const index = featuresAddRem.indexOf(i); |
|
|
|
|
if (index > -1) { |
|
|
|
|
featuresAddRem.splice(index, 1); |
|
|
|
|
} |
|
|
|
|
EventBus.$emit('addFeature', featuresAddRem) |
|
|
|
|
return 'yellow' |
|
|
|
|
} else { |
|
|
|
|
return colorScale(d) |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
featuresAddRem.push(i) |
|
|
|
|
EventBus.$emit('removeFeatures', featuresAddRem) |
|
|
|
|
return "url(#diagonalHatch)" |
|
|
|
|
} |
|
|
|
|
finalresults.push(results) |
|
|
|
|
} |
|
|
|
|
EventBus.$emit('flagLocal', true) |
|
|
|
|
EventBus.$emit('sendSelectedFeaturestoPickle', finalresults) |
|
|
|
|
EventBus.$emit('SendSelectedFeaturesEvent', finalresults) |
|
|
|
|
} else { |
|
|
|
|
return colorScale(d) |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
var svgLeg = d3.select("#LegendHeat"); |
|
|
|
@ -354,7 +395,7 @@ export default { |
|
|
|
|
}) |
|
|
|
|
.attr("y", viewerPosTop + cellSize); |
|
|
|
|
|
|
|
|
|
svgLeg.append("text").attr("x", 200).attr("y", 50).text("Normalized feature importance").style("font-size", "16px").attr("alignment-baseline","top") |
|
|
|
|
svgLeg.append("text").attr("x", 200).attr("y", 50).text("Normalized feature importance (FI)").style("font-size", "16px").attr("alignment-baseline","top") |
|
|
|
|
|
|
|
|
|
//================================================== |
|
|
|
|
// Change ordering of cells |
|
|
|
@ -509,7 +550,11 @@ export default { |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
mounted () { |
|
|
|
|
this.Heatmap() |
|
|
|
|
EventBus.$on('HeatmapCall', data => { this.dataFI = data }) |
|
|
|
|
EventBus.$on('HeatmapCall', this.Heatmap) |
|
|
|
|
|
|
|
|
|
EventBus.$on('quad', data => { this.featureData = data }) |
|
|
|
|
|
|
|
|
|
EventBus.$on('reset', this.reset) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -537,59 +582,5 @@ text.hover { |
|
|
|
|
fill: #66F; |
|
|
|
|
font-background: #000; |
|
|
|
|
} |
|
|
|
|
.heatmap_tooltip { |
|
|
|
|
text-align: center; |
|
|
|
|
font-family: monospace; |
|
|
|
|
font-size: 14pt; |
|
|
|
|
color: #000; |
|
|
|
|
position: relative; |
|
|
|
|
background: rgba(255, 255, 255, 0.8); |
|
|
|
|
border: 4px solid #66F; |
|
|
|
|
padding: 5px; |
|
|
|
|
border-radius: 8px ; |
|
|
|
|
-webkit-border-top-left-radius: 8px; |
|
|
|
|
-webkit-border-top-right-radius: 8px; |
|
|
|
|
-webkit-border-bottom-right-radius: 8px; |
|
|
|
|
-webkit-border-bottom-left-radius: 8px; |
|
|
|
|
-khtml-border-top-left-radius: 8px; |
|
|
|
|
-khtml-border-top-right-radius: 8px; |
|
|
|
|
-khtml-border-bottom-right-radius: 8px; |
|
|
|
|
-khtml-border-bottom-left-radius: 8px; |
|
|
|
|
-moz-border-radius-topleft: 8px; |
|
|
|
|
-moz-border-radius-topright: 8px; |
|
|
|
|
-moz-border-radius-bottomright: 8px; |
|
|
|
|
-moz-border-radius-bottomleft: 8px; |
|
|
|
|
border-top-left-radius: 8px; |
|
|
|
|
border-top-right-radius: 8px; |
|
|
|
|
border-bottom-right-radius: 8px; |
|
|
|
|
border-bottom-left-radius: 8px; |
|
|
|
|
width: 100px; |
|
|
|
|
z-index:10000; |
|
|
|
|
-webkit-box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.8); |
|
|
|
|
-moz-box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.8); |
|
|
|
|
box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.8); |
|
|
|
|
} |
|
|
|
|
.heatmap_tooltip:after, .heatmap_tooltip:before { |
|
|
|
|
top: 100%; |
|
|
|
|
border: solid transparent; |
|
|
|
|
content: " "; |
|
|
|
|
height: 0; |
|
|
|
|
width: 0; |
|
|
|
|
position: absolute; |
|
|
|
|
pointer-events: none; |
|
|
|
|
} |
|
|
|
|
.heatmap_tooltip:after { |
|
|
|
|
border-color: rgba(236, 240, 241, 0); |
|
|
|
|
border-top-color: #FFFFF; |
|
|
|
|
border-width: 10px; |
|
|
|
|
left: 50%; |
|
|
|
|
margin-left: -10px; |
|
|
|
|
} |
|
|
|
|
.heatmap_tooltip:before { |
|
|
|
|
border-color: rgba(44, 62, 80, 0); |
|
|
|
|
border-top-color: #66F; |
|
|
|
|
border-width: 16px; |
|
|
|
|
left: 50%; |
|
|
|
|
margin-left: -16px; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
</style> |