|
|
- function selectCompany(event) {
- var nodeId = event.value;
- network.selectNodes([nodeId]);
- highlightConnections({nodes:[nodeId]})
- network.focusOnNode(nodeId,{animation:false, scale:0.2})
- }
- function selectYear(year) {
- selectedYear = year
- console.log(year)
- populateYearDiv();
- recursiveClearDOM(document.getElementById("projectsDropdown"));
- populateProjectsDropdown();
- recursiveClearDOM(document.getElementById("companyDropdown"));
- }
- function selectProject(event) {
- if (event.value != "none") {
- selectedProject = event.value;
- }
- if (selectedType != "") {
- if (network) {
- network.destroy()
- network = null;
- }
- loadJSON('./data/combined/' + selectedYear + "_" + selectedProject + ".json", drawAll);
- document.getElementById("FILENAME").innerHTML = selectedYear + "_" + selectedProject + ".json";
- }
- }
- function selectType(type) {
- if (selectedType != type) {
- selectedType = type;
- totalValue = 0;
- populateTypeDiv();
- var allNodes = nodes.get();
-
- if (allNodes.length > 0) {
- if (selectedType == "connections") {
- for (var i = 0; i < allNodes.length; i++) {
- var node = allNodes[i];
- node.title = node.id + ": " + node.euData[selectedType];
- node.value = Math.max(1,Math.pow(Number(node.euData[selectedType]),1.05));
- totalValue += node.value;
- }
- network.setOptions({nodes:{radiusMax: nodeRadius, customScalingFunction:function (min,max,total,value) {
- if (max == min) {
- return 0.5;
- }
- else {
- var scale = 1 / (max - min);
- return Math.max(0,(value - min)*scale);
- }
- }}});
- }
- else { // by funding
- for (var i = 0; i < allNodes.length; i++) {
- var node = allNodes[i];
- node.title = node.id + ": " + Math.round(Number(node.euData[selectedType])) + " Euro";
- node.value = Number(node.euData[selectedType]);
- totalValue += node.value;
- }
- network.setOptions({nodes:{radiusMax: 80*nodeRadius, customScalingFunction:function (min,max,total,value) {
- var scale = value / total;
- return scale;
- }}});
- }
- nodes.update(allNodes);
- }
- }
- }
-
- function recursiveClearDOM(DOMobject) {
- while (DOMobject.hasChildNodes() == true) {
- recursiveClearDOM(DOMobject.firstChild);
- DOMobject.removeChild(DOMobject.firstChild);
- }
- }
-
- function viewAllNeighbours() {
- network.zoomExtent({nodes:connectedNodes, duration:0})
- }
-
- function doSteps(amount) {
- network.setFreezeSimulation(false);
- network.setOptions({stabilizationIterations:amount})
- network._stabilize()
- network.setFreezeSimulation(true);
- }
-
- var network;
- var nodes;
- var edges;
- var edgeOpacity = 0.15;
- var totalValue = 0;
-
- function drawAll(dataJSON, file) {
- // create an array with nodes
- nodes = new vis.DataSet(dataJSON.nodes);
-
- // create an array with edges
- edges = new vis.DataSet(dataJSON.edges);
-
- var totalMass = 0;
- totalValue = 0;
- for (var i = 0; i < dataJSON.nodes.length; i++) {
- totalMass += dataJSON.nodes[i].mass;
- totalValue += dataJSON.nodes[i].value;
- }
-
- var gravityConstant = -20000;
- if (totalMass < 2000) {
- gravityConstant = -2000;
- }
-
- var edgeNodeRatio = Math.max(1,dataJSON.edges.length) / Math.max(1,dataJSON.nodes.length);
- var nodeEdgeRatio = Math.max(1,dataJSON.nodes.length) / Math.max(1,dataJSON.edges.length);
-
- var centralGravity = Math.min(5,Math.max(0.1,edgeNodeRatio));
- var amountOfNodes = dataJSON.nodes.length;
-
- edgeOpacity = Math.min(1.0,Math.max(0.15,nodeEdgeRatio*2));
- nodeRadius = amountOfNodes * 0.8;
-
- var container = document.getElementById('mynetwork');
- var data = {
- nodes: nodes,
- edges: edges
- };
-
- var options = {
- stabilize: false,
- stabilizationIterations: 15000,
- smoothCurves: {
- enabled: true,
- dynamic: false
- },
- configurePhysics: false,
- physics: {barnesHut: {gravitationalConstant: gravityConstant, centralGravity: centralGravity, springLength: 100, springConstant: 0.001}},
- //physics: {barnesHut: {gravitationalConstant: 0, centralGravity: 0.0, springConstant: 0}},
- nodes: {
- shape: 'dot',
- radiusMax: nodeRadius,
- fontColor: '#ffffff',
- fontDrawThreshold: 8,
- scaleFontWithValue: true,
- fontSizeMin: 8,
- fontSizeMax: amountOfNodes * 0.25,
- fontSizeMaxVisible: 20,
- fontStrokeWidth: 1, // px
- fontStrokeColor: '#222222'
- },
- edges: {
- opacity: edgeOpacity
- },
- hideEdgesOnDrag: true,
- maxVelocity: 100,
- tooltip: {
- delay: 200,
- fontSize: 12,
- color: {
- background: "#fff"
- }
- }
- };
- network = new vis.Network(container, data, options);
- network.setFreezeSimulation(true);
- network.on("click",highlightConnections);
- populateCompanyDropdown();
- window.onresize = function () {network.redraw();};
- }
- // marked is used so we don't do heavy stuff on each click
- var marked = false;
- var connectedNodes = [];
- function highlightConnections(selectedItems) {
- if (selectedItems.nodes[0] == 'none') {
- return;
- }
-
- var nodeId;
- var requireUpdate = false;
-
- // we get all data from the dataset once to avoid updating multiple times.
- if (selectedItems.nodes.length == 0 && marked === true) {
- connectedNodes = [];
- requireUpdate = true;
- var allNodes = nodes.get({returnType:"Object"});
-
- // restore on unselect
- for (nodeId in allNodes) {
- allNodes[nodeId].color = undefined;
- if (allNodes[nodeId].oldLabel !== undefined) {
- allNodes[nodeId].label = allNodes[nodeId].oldLabel;
- allNodes[nodeId].oldLabel = undefined;
- }
- }
- marked = false;
- network.setOptions({nodes:{fontSizeMin:14},edges:{opacity:edgeOpacity}})
- }
- else if (selectedItems.nodes.length > 0) {
- var allNodes = nodes.get({returnType:"Object"});
-
- marked = true;
- requireUpdate = true;
-
- var mainNode = selectedItems.nodes[0]; // this is an ID
- connectedNodes = network.getConnectedNodes(mainNode);
- connectedNodes.push(mainNode);
-
- for (nodeId in allNodes) {
- allNodes[nodeId].color = 'rgba(150,150,150,0.1)';
- if (allNodes[nodeId].oldLabel === undefined) {
- allNodes[nodeId].oldLabel = allNodes[nodeId].label;
- allNodes[nodeId].label = "";
- }
- }
-
- for (var i = 0; i < connectedNodes.length; i++) {
- allNodes[connectedNodes[i]].color = undefined;
- if (allNodes[connectedNodes[i]].oldLabel !== undefined) {
- allNodes[connectedNodes[i]].label = allNodes[connectedNodes[i]].oldLabel;
- allNodes[connectedNodes[i]].oldLabel = undefined;
- }
- }
-
- // we want to set the fontSizeMin just so that the node we're looking at has a good fontsize at the zoomLevel
- console.log(totalValue, allNodes[mainNode].value)
-
- network.setOptions({nodes:{fontSizeMin:150},edges:{opacity:0.025}})
- }
-
- if (requireUpdate === true) {
- var updateArray = [];
- for (nodeId in allNodes) {
- updateArray.push(allNodes[nodeId]);
- }
- nodes.update(updateArray);
- }
- }
-
- function loadJSON(path, success, error) {
- selectedFile = path;
- var xhr = new XMLHttpRequest();
- xhr.onreadystatechange = function() {
- if (xhr.readyState === 4) {
- if (xhr.status === 200) {
- success(JSON.parse(xhr.responseText), path);
- }
- else {
- error();
- }
- }
- };
- xhr.open("GET", path, true);
-
- xhr.send();
- }
-
-
- function populateCompanyDropdown() {
- var nodesAr = nodes.get();
- var nodeIds = [];
- for (var i = 0; i < nodesAr.length;i++) {
- nodeIds.push(nodesAr[i].id);
- }
- nodeIds.sort()
- var dropdown = document.getElementById("companyDropdown");
- var option = document.createElement('option');
- option.text = '-- pick a company to focus on.';
- option.value = 'none';
- dropdown.add(option);
- for (i = 0; i < nodeIds.length; i++) {
- option = document.createElement('option');
- option.text = option.value = nodeIds[i];
- dropdown.add(option);
- }
- }
-
- function populateTypeDiv() {
- var container = document.getElementById("typeContainer");
- recursiveClearDOM(container);
- var types = ['funding', 'connections'];
- var typeLabels = ['size by funding', 'size by connections'];
- for (i = 0; i < types.length; i++) {
- var div = document.createElement('div');
- div.className = 'type';
- if (types[i] == selectedType) {
- div.className += ' selected'
- }
- div.innerHTML = typeLabels[i];
- div.onclick = selectType.bind(this,types[i])
- container.appendChild(div);
- }
- }
-
- function populateYearDiv() {
- var container = document.getElementById("yearContainer");
- recursiveClearDOM(container);
- for (i = 0; i < years.length; i++) {
- var div = document.createElement('div');
- div.className = 'year';
- if (years[i] == selectedYear) {
- div.className += ' selected'
- }
- div.innerHTML = years[i];
- div.onclick = selectYear.bind(this,years[i])
- container.appendChild(div);
- }
- }
-
- function populateProjectsDropdown() {
- var dropdown = document.getElementById("projectsDropdown");
- var option = document.createElement('option');
- option.text = '-- pick project to see the connections';
- option.value = 'none';
- dropdown.add(option);
- for (i = 0; i < yearlyProjects[selectedYear].length; i++) {
- option = document.createElement('option');
- option.text = option.value = yearlyProjects[selectedYear][i];
- dropdown.add(option);
- }
- }
-
- function download() {
- var file = selectedFile.replace("./data/combined/","");
- var nodesAr = nodes.get();
- var edgesAr = edges.get();
- var obj = {nodes: nodesAr, edges: edgesAr};
- var json = JSON.stringify(obj);
- var blob = new Blob([json], {type: "text/plain;charset=utf-8"});
- saveAs(blob, file);
- }
-
- var filesList = [
- '2010_FP7-ENERGY.json',
- '2010_FP7-ENVIRONMENT.json',
- '2010_FP7-EURATOM-FISSION.json',
- '2010_FP7-HEALTH.json',
- '2010_FP7-ICT.json',
- '2010_FP7-IDEAS-ERC.json',
- '2010_FP7-INCO.json',
- '2010_FP7-INFRASTRUCTURES.json',
- '2010_FP7-JTI.json',
- '2010_FP7-KBBE.json',
- '2010_FP7-NMP.json',
- '2010_FP7-PEOPLE.json',
- '2010_FP7-REGIONS.json',
- '2010_FP7-REGPOT.json',
- '2010_FP7-SIS.json',
- '2010_FP7-SME.json',
- '2010_FP7-SPACE.json',
- '2010_FP7-SSH.json',
- '2010_FP7-TRANSPORT.json',
- '2010_Other.json',
- '2011_FP7-COH.json',
- '2011_FP7-ENERGY.json',
- '2011_FP7-ENVIRONMENT.json',
- '2011_FP7-EURATOM-FISSION.json',
- '2011_FP7-GA.json',
- '2011_FP7-HEALTH.json',
- '2011_FP7-ICT,FP7-JTI.json',
- '2011_FP7-ICT.json',
- '2011_FP7-IDEAS-ERC.json',
- '2011_FP7-INCO.json',
- '2011_FP7-INFRASTRUCTURES.json',
- '2011_FP7-JTI.json',
- '2011_FP7-KBBE.json',
- '2011_FP7-NMP,FP7-INFRASTRUCTURES.json',
- '2011_FP7-NMP,FP7-TRANSPORT.json',
- '2011_FP7-NMP.json',
- '2011_FP7-PEOPLE.json',
- '2011_FP7-REGIONS.json',
- '2011_FP7-REGPOT.json',
- '2011_FP7-SECURITY.json',
- '2011_FP7-SIS.json',
- '2011_FP7-SME.json',
- '2011_FP7-SPACE.json',
- '2011_FP7-SSH.json',
- '2011_FP7-TRANSPORT.json',
- '2012_CIP.json',
- '2012_FP7-ENERGY.json',
- '2012_FP7-ENVIRONMENT.json',
- '2012_FP7-EURATOM-FISSION.json',
- '2012_FP7-HEALTH.json',
- '2012_FP7-ICT.json',
- '2012_FP7-IDEAS-ERC.json',
- '2012_FP7-INCO.json',
- '2012_FP7-INFRASTRUCTURES.json',
- '2012_FP7-JTI.json',
- '2012_FP7-KBBE.json',
- '2012_FP7-NMP.json',
- '2012_FP7-PEOPLE.json',
- '2012_FP7-REGIONS.json',
- '2012_FP7-REGPOT.json',
- '2012_FP7-SECURITY.json',
- '2012_FP7-SIS.json',
- '2012_FP7-SME.json',
- '2012_FP7-SPACE.json',
- '2012_FP7-SSH.json',
- '2012_FP7-TRANSPORT.json',
- '2012_Other.json',
- '2013_CIP.json',
- '2013_FP7-COH.json',
- '2013_FP7-ENERGY.json',
- '2013_FP7-ENVIRONMENT.json',
- '2013_FP7-EURATOM-FISSION.json',
- '2013_FP7-HEALTH.json',
- '2013_FP7-ICT.json',
- '2013_FP7-IDEAS-ERC.json',
- '2013_FP7-INCO.json',
- '2013_FP7-INFRASTRUCTURES,FP7-SME.json',
- '2013_FP7-INFRASTRUCTURES.json',
- '2013_FP7-JTI.json',
- '2013_FP7-KBBE.json',
- '2013_FP7-NMP.json',
- '2013_FP7-PEOPLE.json',
- '2013_FP7-REGIONS.json',
- '2013_FP7-REGPOT.json',
- '2013_FP7-SECURITY.json',
- '2013_FP7-SIS.json',
- '2013_FP7-SME.json',
- '2013_FP7-SPACE.json',
- '2013_FP7-SSH.json',
- '2013_FP7-TRANSPORT.json',
- ]
- filesList.sort();
-
- var fileIndex = -1;
- function next() {
- if (network) {
- network.destroy()
- network = null;
- }
- fileIndex++;
- document.getElementById("FILENAME").innerHTML = filesList[fileIndex];
- loadJSON('./data/combined/' + filesList[fileIndex], drawAll)
- }
-
- var years = [];
- var yearlyProjects = {};
- var selectedFile = "";
- for (var i = 0; i < filesList.length; i++) {
- var filename = filesList[i];
- var filenameArray = filename.split("_");
- var year = filenameArray[0];
- var project = filenameArray[1].replace(".json", "");
- if (years.indexOf(year) == -1) {
- years.push(year);
- yearlyProjects[year] = [];
- }
- yearlyProjects[year].push(project);
- }
- var selectedYear = years[years.length-1];
- var selectedType = "connections";
- var selectedProject = "";
- var nodeRadius = 1000;
-
- populateYearDiv();
- populateTypeDiv();
- populateProjectsDropdown();
-
- //next()
|