From f0a4571f683cef9f2800ee915ba06f79ac9c8d06 Mon Sep 17 00:00:00 2001 From: Peter Kraker Date: Tue, 15 May 2018 17:05:40 +0200 Subject: [PATCH] Introduce dynamic cluster numbers and dynamic sizing for large projects --- examples/viper/data-config_openaire.js | 4 ++ .../preprocessing/other-scripts/vis_layout.R | 21 ++++++++- vis/js/default-config.js | 4 ++ vis/js/headstart.js | 44 +++++++++++++++++++ vis/js/mediator.js | 12 ++++- vis/js/scale.js | 1 + 6 files changed, 83 insertions(+), 3 deletions(-) diff --git a/examples/viper/data-config_openaire.js b/examples/viper/data-config_openaire.js index 3b46f38c1..2ce49aeb6 100644 --- a/examples/viper/data-config_openaire.js +++ b/examples/viper/data-config_openaire.js @@ -7,6 +7,10 @@ var data_config = { paper_min_scale: 1, paper_max_scale: 1, + + dynamic_sizing: true, + dynamic_force_area: true, + dynamic_force_papers: true, service: "openaire", base_unit: "citations", diff --git a/server/preprocessing/other-scripts/vis_layout.R b/server/preprocessing/other-scripts/vis_layout.R index eae9a208e..858ea299b 100644 --- a/server/preprocessing/other-scripts/vis_layout.R +++ b/server/preprocessing/other-scripts/vis_layout.R @@ -237,15 +237,34 @@ create_clusters <- function(distance_matrix, max_clusters=-1, method="ward.D") { } ) } + + num_items = nrow(distance_matrix) if(!is.null(num_clusters) && max_clusters > -1 && num_clusters > max_clusters) { num_clusters = MAX_CLUSTERS + + if(num_items >= 150) { + print("High content number, increasing max_k.") + if(num_items >= 150 && num_items < 200) { + num_clusters = 16 + } else if (num_items >= 200 && num_items < 300) { + num_clusters = 17 + } else if (num_items >= 300 && num_items < 400) { + num_clusters = 18 + } else if (num_items >= 400 && num_items < 500) { + num_clusters = 19 + } else if (num_items >= 500) { + num_clusters = 20 + } + } } - if(nrow(distance_matrix) <= 30){ + if(num_items <= 30){ print("Low content number, lowering max_k.") num_clusters = round(sqrt(nrow(distance_matrix))) + 1 } + + meta_cluster = attr(css_cluster,"meta") cluster = meta_cluster$hclust.obj diff --git a/vis/js/default-config.js b/vis/js/default-config.js index c7a3c3e1e..241203036 100644 --- a/vis/js/default-config.js +++ b/vis/js/default-config.js @@ -6,6 +6,7 @@ var config = { zoom_factor: 0.9, padding_articles: 0, circle_padding: 0, + dynamic_sizing: false, // map min_height: 600, @@ -59,6 +60,9 @@ var config = { is_force_papers: true, papers_force_alpha: 0.1, + + dynamic_force_area: false, + dynamic_force_papers: false, render_list: true, render_bubbles: true, diff --git a/vis/js/headstart.js b/vis/js/headstart.js index f65651860..c8030299e 100644 --- a/vis/js/headstart.js +++ b/vis/js/headstart.js @@ -78,6 +78,50 @@ HeadstartFSM.prototype = { }); }, + + dynamicForcePapers: function(num_items) { + if (num_items >= 150 && num_items < 200) { + config.papers_force_alpha = 0.2; + } else if (num_items >= 200) { + config.papers_force_alpha = 0.3; + } + }, + + dynamicForceAreas: function(num_items) { + if (num_items >= 200) { + config.area_force_alpha = 0.02; + } + }, + + dynamicSizing: function(num_items) { + if (num_items >= 150 && num_items < 200) { + this.adjustSizes(0.9, 1.1); + } else if (num_items >= 200 && num_items < 250) { + this.adjustSizes(0.8, 1.1); + } else if (num_items >= 250 && num_items < 300) { + this.adjustSizes(0.7, 1.1); + } else if (num_items >= 250 && num_items < 300) { + this.adjustSizes(0.6, 1.1); + } else if (num_items >= 300 && num_items < 350) { + this.adjustSizes(0.5, 1.2); + } else if (num_items >= 350 && num_items < 400) { + this.adjustSizes(0.4, 1.2); + } else if (num_items >= 400 && num_items < 450) { + this.adjustSizes(0.3, 1.2); + } else if (num_items >= 450 && num_items < 500) { + this.adjustSizes(0.2, 1.2); + } else if (num_items >= 500) { + this.adjustSizes(0.1, 1.2); + } + }, + + adjustSizes: function(resize_paper_factor, resize_bubble_factor) { + //config.papers_min_scale /= resize_paper_factor; + config.papers_max_scale /= resize_paper_factor; + + config.bubble_min_scale *= resize_bubble_factor; + config.bubble_max_scale *= resize_bubble_factor; + }, createRestUrl: function () { let url = config.server_url + "services/getBookmarks.php?user=" + config.user_id; diff --git a/vis/js/mediator.js b/vis/js/mediator.js index 5fe2359dc..6f9fb4c45 100644 --- a/vis/js/mediator.js +++ b/vis/js/mediator.js @@ -226,19 +226,27 @@ MyMediator.prototype = { }, init_start_visualization: function(highlight_data, csv) { + let data = (config.show_context)?(JSON.parse(csv.data)):csv; + let context = (config.show_context)?(csv.context):{}; + mediator.manager.registerModule(headstart, 'headstart'); + + if(config.is_force_papers && config.dynamic_force_papers) mediator.manager.call('headstart', 'dynamicForcePapers', [data.length]); + if(config.is_force_area && config.dynamic_force_area) mediator.manager.call('headstart', 'dynamicForceAreas', [data.length]); + if(config.dynamic_sizing) mediator.manager.call('headstart', 'dynamicSizing', [data.length]); if (config.render_bubbles) mediator.manager.registerModule(mediator.current_bubble, 'bubble'); + mediator.manager.call('canvas', 'setupCanvas', []); if(config.scale_toolbar) { mediator.manager.registerModule(scale, 'scale') mediator.manager.call('scale', 'drawScaleTypes', []) } - let data = (config.show_context)?(JSON.parse(csv.data)):csv; - let context = (config.show_context)?(csv.context):{}; + mediator.manager.call('io', 'initializeMissingData', [data]); mediator.manager.call('io', 'prepareData', [highlight_data, data]); mediator.manager.call('io', 'prepareAreas', []); + mediator.manager.call('io', 'setContext', [context, data.length]); mediator.manager.call('io', 'setInfo', [context]); mediator.manager.call('canvas', 'drawTitle', [context]); diff --git a/vis/js/scale.js b/vis/js/scale.js index b8f2f07dd..59c2a3630 100644 --- a/vis/js/scale.js +++ b/vis/js/scale.js @@ -39,6 +39,7 @@ class Scale { doScale (type) { config.scale_by = type config.base_unit = config.scale_base_unit[type]; + config.dynamic_sizing = false; if(type === "content_based") { config.content_based = true;