From cfae67d88910071ad648a89336015f78234acf24 Mon Sep 17 00:00:00 2001 From: Jim Pollaro <30908497+pollaro@users.noreply.github.com> Date: Mon, 20 Jul 2026 15:18:19 -0500 Subject: [PATCH 1/2] [NET-315] In QC window, apply the remove network to all the different methods (#159) merge conflict from cherry pick --- +nla/+qualityControl/checkHeadMotion.m | 34 +++++++++++++------- +nla/+qualityControl/checkNormalityWithKS.m | 33 ++++++++++++------- +nla/NetworkAtlas.m | 14 ++++++-- +nla/removeNetworks.m | 3 +- NLAQualityControl.mlapp | Bin 14666 -> 14561 bytes 5 files changed, 57 insertions(+), 27 deletions(-) diff --git a/+nla/+qualityControl/checkHeadMotion.m b/+nla/+qualityControl/checkHeadMotion.m index a09d25c1..c937609a 100755 --- a/+nla/+qualityControl/checkHeadMotion.m +++ b/+nla/+qualityControl/checkHeadMotion.m @@ -1,14 +1,24 @@ -function checkHeadMotion(fig, input_struct, motion) +function checkHeadMotion(fig, input_struct, motion, remove_index) + network_atlas = input_struct.net_atlas; + functional_connectivity = input_struct.func_conn; + if remove_index ~= 0 + [new_netatlas, functional_connectivity] = nla.removeNetworks(input_struct.net_atlas, input_struct.net_atlas.nets(remove_index).name, strcat(input_struct.net_atlas.name, '_-', input_struct.net_atlas.nets(remove_index).name), input_struct.func_conn); + network_atlas = nla.NetworkAtlas(new_netatlas); + if ~isa(functional_connectivity, 'nla.TriMatrix') + functional_connectivity = nla.TriMatrix(functional_connectivity); + end + end + prog = uiprogressdlg(fig, 'Title', 'Generating figures', 'Message', 'Generating head motion figures'); prog.Value = 0.02; - distances = nla.helpers.euclidianDistanceROIs(input_struct.net_atlas); + distances = nla.helpers.euclidianDistanceROIs(network_atlas); prog.Value = 0.75; - [r_vec, p_vec] = corr(motion, input_struct.func_conn.v', 'type', 'Pearson'); + [r_vec, p_vec] = corr(motion, functional_connectivity.v', 'type', 'Pearson'); - prob = nla.TriMatrix(input_struct.net_atlas.numROIs()); - r = nla.TriMatrix(input_struct.net_atlas.numROIs()); - h = nla.TriMatrix(input_struct.net_atlas.numROIs(), 'logical'); + prob = nla.TriMatrix(network_atlas.numROIs()); + r = nla.TriMatrix(network_atlas.numROIs()); + h = nla.TriMatrix(network_atlas.numROIs(), 'logical'); prob.v = p_vec'; r.v = r_vec'; h.v = nla.lib.fdr_bh(prob.v); @@ -25,7 +35,7 @@ function checkHeadMotion(fig, input_struct, motion) ulimit = 0.3; fig = nla.gfx.createFigure(1800, 900); - matrix_plot = nla.gfx.plots.MatrixPlot(fig, "FC-motion correlation (Pearson's r)", r, input_struct.net_atlas.nets,... + matrix_plot = nla.gfx.plots.MatrixPlot(fig, "FC-motion correlation (Pearson's r)", r, network_atlas.nets,... nla.gfx.FigSize.LARGE, 'lower_limit', llimit, 'upper_limit', ulimit); matrix_plot.displayImage(); width = matrix_plot.image_dimensions("image_width"); @@ -35,14 +45,14 @@ function checkHeadMotion(fig, input_struct, motion) ax = subplot('Position', [0.780, 0.540, 0.20, 0.40]); nla.gfx.setTitle(ax, sprintf("FC-motion correlation (Pearson's r) (q < 0.05)\n")); - nla.gfx.drawROIsOnCortex(ax, input_struct.net_atlas, ctx, mesh_alpha, ROI_radius, nla.gfx.ViewPos.DORSAL, false,... + nla.gfx.drawROIsOnCortex(ax, network_atlas, ctx, mesh_alpha, ROI_radius, nla.gfx.ViewPos.DORSAL, false,... nla.gfx.BrainColorMode.NONE); - for col = 1:input_struct.net_atlas.numROIs() - for row = (col + 1):input_struct.net_atlas.numROIs() + for col = 1:network_atlas.numROIs() + for row = (col + 1):network_atlas.numROIs() if h.get(row, col) - pos1 = input_struct.net_atlas.ROIs(row).pos; - pos2 = input_struct.net_atlas.ROIs(col).pos; + pos1 = network_atlas.ROIs(row).pos; + pos2 = network_atlas.ROIs(col).pos; edge_color = nla.gfx.valToColor(r.get(row, col), llimit, ulimit, color_map); diff --git a/+nla/+qualityControl/checkNormalityWithKS.m b/+nla/+qualityControl/checkNormalityWithKS.m index 19ec0634..3bb8eacb 100644 --- a/+nla/+qualityControl/checkNormalityWithKS.m +++ b/+nla/+qualityControl/checkNormalityWithKS.m @@ -1,4 +1,4 @@ -function checkNormalityWithKS(fig, input_struct, test_pool) +function checkNormalityWithKS(fig, input_struct, test_pool, remove_index) prog = uiprogressdlg(... fig, 'Title', 'Checking Normaility', 'Message', 'Running Kolmogorov-Smirnov Test'... @@ -9,25 +9,31 @@ function checkNormalityWithKS(fig, input_struct, test_pool) edge_test_result = test_pool.runEdgeTest(input_struct); prog.Value = 0.5; - ks_result = runKolmogorovSmirnovTest(input_struct, edge_test_result); + ks_result = runKolmogorovSmirnovTest(input_struct, edge_test_result, remove_index); prog.Value = 0.75; - qcKSOutput(ks_result.p, input_struct) + qcKSOutput(ks_result.p, input_struct, remove_index) end -function ks_result = runKolmogorovSmirnovTest(input_struct, edge_result) +function ks_result = runKolmogorovSmirnovTest(input_struct, edge_result, remove_index) import nla.TriMatrix nla.TriMatrixDiag + network_atlas = input_struct.net_atlas; + if remove_index ~= 0 + [new_netatlas] = nla.removeNetworks(input_struct.net_atlas, input_struct.net_atlas.nets(remove_index).name, strcat(input_struct.net_atlas.name, '_-', input_struct.net_atlas.nets(remove_index).name)); + network_atlas = nla.NetworkAtlas(new_netatlas); + end + ks_result = struct(); - number_of_networks = input_struct.net_atlas.numNets(); + number_of_networks = network_atlas.numNets(); ks_result.p = TriMatrix(number_of_networks, TriMatrixDiag.KEEP_DIAGONAL); ks_result.ks = TriMatrix(number_of_networks, TriMatrixDiag.KEEP_DIAGONAL); for network1 = 1:number_of_networks for network2 = 1:network1 - network_rho = edge_result.coeff.get(input_struct.net_atlas.nets(network1).indexes,... - input_struct.net_atlas.nets(network2).indexes); + network_rho = edge_result.coeff.get(network_atlas.nets(network1).indexes,... + network_atlas.nets(network2).indexes); [~, p, ks] = kstest(network_rho); ks_result.p.set(network1, network2, p); ks_result.ks.set(network1, network2, ks); @@ -35,7 +41,7 @@ function checkNormalityWithKS(fig, input_struct, test_pool) end end -function qcKSOutput(ks_result_p_value, edge_test_options) +function qcKSOutput(ks_result_p_value, edge_test_options, remove_index) % This will open the qc figure for the KS test network_test_options = nla.net.genBaseInputs(); @@ -45,15 +51,20 @@ function qcKSOutput(ks_result_p_value, edge_test_options) edge_test_options.prob_max = 0.05; default_discrete_colors = 1000; - [~, p_value_max] = network_test_options.fdr_correction.correct(edge_test_options.net_atlas,... - edge_test_options, ks_result_p_value); + network_atlas = edge_test_options.net_atlas; + if remove_index ~= 0 + [new_netatlas] = nla.removeNetworks(edge_test_options.net_atlas, edge_test_options.net_atlas.nets(remove_index).name, strcat(edge_test_options.net_atlas.name, '-', edge_test_options.net_atlas.nets(remove_index).name)); + network_atlas = nla.NetworkAtlas(new_netatlas); + end + + [~, p_value_max] = network_test_options.fdr_correction.correct(network_atlas, edge_test_options, ks_result_p_value); color_map = nla.net.result.NetworkResultPlotParameter.getColormap(default_discrete_colors,... p_value_max); fig = nla.gfx.createFigure(); % Also remember to move this in read the docs - matrix_plot = nla.gfx.plots.MatrixPlot(fig, sprintf("Non-permuted Kolmogorov-Smirnov Test p-value\nSmaller values are less normal"), ks_result_p_value, edge_test_options.net_atlas.nets, nla.gfx.FigSize.LARGE,... + matrix_plot = nla.gfx.plots.MatrixPlot(fig, sprintf("Non-permuted Kolmogorov-Smirnov Test p-value\nSmaller values are less normal"), ks_result_p_value, network_atlas.nets, nla.gfx.FigSize.LARGE,... 'lower_limit', 0.00, 'upper_limit', p_value_max, 'color_map', color_map); matrix_plot.displayImage(); width = matrix_plot.image_dimensions('image_width'); diff --git a/+nla/NetworkAtlas.m b/+nla/NetworkAtlas.m index d47740de..b1023c31 100755 --- a/+nla/NetworkAtlas.m +++ b/+nla/NetworkAtlas.m @@ -12,10 +12,13 @@ % :param space: (Optional) The mesh that the atlas` ROI locations/parcels are in. Two options - ``Talairach (TT)`` or ``Montreal Neurological Institute (MNI)`` properties (SetAccess = private) - nets % This is the net_names - + nets + net_names ROIs + ROI_key + ROI_pos ROI_order + net_colors name space anat = false; @@ -37,7 +40,8 @@ end net_names = net_struct.net_names; - + obj.net_names = net_names; + net_count = numel(net_names); ROI_count = size(net_struct.ROI_key, 1); @@ -45,6 +49,7 @@ if isfield(net_struct, 'net_colors') net_colors = net_struct.net_colors; end + obj.net_colors = net_colors; ROI_positions = zeros(ROI_count, 3); if isfield(net_struct, 'ROI_pos') @@ -60,6 +65,9 @@ net_struct.ROI_order = net_struct.ROI_order(sort_idx); ROI_positions = ROI_positions(sort_idx, :); end + obj.ROI_pos = ROI_positions; + obj.ROI_key = net_struct.ROI_key; + obj.ROI_order = net_struct.ROI_order; %% Network atlas name obj.name = net_struct.name; diff --git a/+nla/removeNetworks.m b/+nla/removeNetworks.m index e8de1295..f16c1c3d 100755 --- a/+nla/removeNetworks.m +++ b/+nla/removeNetworks.m @@ -78,7 +78,8 @@ %% Functional connectivity (optional) if exist('fc_in', 'var') - fc_ordered = fc_in(atlas_in.ROI_order, atlas_in.ROI_order, :); + fc_in_matrix = fc_in.asMatrix(); + fc_ordered = fc_in_matrix(atlas_in.ROI_order, atlas_in.ROI_order, :); fc_reduced = fc_ordered(ROI_mask, ROI_mask, :); ROI_order_inverse(atlas_out.ROI_order) = [1:numel(atlas_out.ROI_order)]'; fc_out = fc_reduced(ROI_order_inverse, ROI_order_inverse, :); diff --git a/NLAQualityControl.mlapp b/NLAQualityControl.mlapp index 97ded08b78c03e85986dc5fa1ccfadf293310396..cfb56c2c9dde121923c8237b248cf3f51fe938aa 100644 GIT binary patch delta 12253 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

y`PpEXuN2hv3G} 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 GI{yckA`7bk From ebd56c99b2d49491fd1212de926f1b494dc75ea2 Mon Sep 17 00:00:00 2001 From: Jim Pollaro <30908497+pollaro@users.noreply.github.com> Date: Thu, 30 Jul 2026 11:01:35 -0500 Subject: [PATCH 2/2] [NET-314] Add scaling and colormap changes to chords, FC plot, and edge plot (#165) * added scaling and colormap choice to chords * hopefully centering plots together * Exported mlapp files * edge chord scaling * moved color and scale modals to seperate functions * trying to put colormap select and scale to non-app matrix plot * added lots of str2double * added scaling setting for edge matrix plot * Exported mlapp files * [NET-314] Scaling and color choice on chord plots (#160) * added scaling and colormap choice to chords * hopefully centering plots together * Exported mlapp files * edge chord scaling * moved color and scale modals to seperate functions * trying to put colormap select and scale to non-app matrix plot * added lots of str2double * added scaling setting for edge matrix plot * Exported mlapp files --------- Co-authored-by: Github Action * fix chord plotting * color map fix * fix small errors that cause breakage. string -> number issues * Exported mlapp files * adjust one input --------- Co-authored-by: Github Action --- +nla/+edge/+result/Base.m | 2 +- +nla/+gfx/+plots/MatrixPlot.m | 60 +++++++-- +nla/+gfx/colorSelector.m | 46 +++++++ +nla/+gfx/scaleSelector.m | 28 ++++ +nla/+inputField/NetworkAtlasFuncConn.m | 3 +- +nla/+net/+result/+chord/ChordPlotter.m | 122 +++++++++++++++--- .../+result/+plot/NetworkTestPlotApp.mlapp | Bin 42364 -> 42310 bytes .../+plot/NetworkTestPlotApp_exported.m | 18 +-- 8 files changed, 238 insertions(+), 41 deletions(-) create mode 100644 +nla/+gfx/colorSelector.m create mode 100644 +nla/+gfx/scaleSelector.m diff --git a/+nla/+edge/+result/Base.m b/+nla/+edge/+result/Base.m index 39de0ad0..e582cf2a 100755 --- a/+nla/+edge/+result/Base.m +++ b/+nla/+edge/+result/Base.m @@ -44,7 +44,7 @@ function output(obj, net_atlas, flags, prob_label) fig = nla.gfx.createFigure(); matrix_plot = nla.gfx.plots.MatrixPlot(fig, coeff_label, obj.coeff, net_atlas.nets, nla.gfx.FigSize.LARGE, 'lower_limit', obj.coeff_range(1),... - 'upper_limit', obj.coeff_range(2)); + 'upper_limit', obj.coeff_range(2), 'app_plot', false); matrix_plot.displayImage(); w = matrix_plot.image_dimensions("image_width"); h = matrix_plot.image_dimensions("image_height"); diff --git a/+nla/+gfx/+plots/MatrixPlot.m b/+nla/+gfx/+plots/MatrixPlot.m index 0b90ec04..a43b8ee2 100644 --- a/+nla/+gfx/+plots/MatrixPlot.m +++ b/+nla/+gfx/+plots/MatrixPlot.m @@ -35,6 +35,7 @@ current_settings % the settings for the plot (upper, lower, scale) display_legend p_value_max + app_plot % Used when called for FC Avg end properties (Dependent) @@ -112,12 +113,13 @@ addParameter(matrix_input_parser, 'y_position', 0, validNumberInput); addParameter(matrix_input_parser, 'discrete_colorbar', false, @islogical); addParameter(matrix_input_parser, 'plot_scale', nla.gfx.ProbPlotMethod.DEFAULT); - addParameter(matrix_input_parser, 'p_value_max', 0.05) + addParameter(matrix_input_parser, 'p_value_max', 0.05); + addParameter(matrix_input_parser, 'app_plot', true, @islogical) parse(matrix_input_parser, figure, name, matrix, networks, figure_size, varargin{:}); properties = {'figure', 'name', 'matrix', 'networks', 'figure_size', 'network_clicked_callback',... 'marked_networks', 'figure_margins', 'draw_legend', 'draw_colorbar', 'color_map', 'lower_limit',... - 'upper_limit', 'x_position', 'y_position', 'discrete_colorbar', 'plot_scale', 'p_value_max'}; + 'upper_limit', 'x_position', 'y_position', 'discrete_colorbar', 'plot_scale', 'p_value_max', 'app_plot'}; for property = properties obj.(property{1}) = matrix_input_parser.Results.(property{1}); if property{1} == "marked_networks" @@ -182,6 +184,18 @@ function displayImage(obj) 'HorizontalAlignment', 'center'); end + if isequal(obj.app_plot, false) + settings_menu = uimenu(obj.figure, 'Text', 'Settings'); + change_scale_option = uimenu(settings_menu,'Text','Change Scale'); + change_scale_option.MenuSelectedFcn = {... + @obj.adjustScale, [obj.lower_limit, obj.upper_limit], obj.figure,... + struct('lower_bound', obj.lower_limit, 'upper_bound', obj.upper_limit, 'p_value_plot_max', obj.p_value_max),... + false... + }; + change_color_map = uimenu(settings_menu, 'Text', 'Change Color Map'); + change_color_map.MenuSelectedFcn = {@obj.adjustColor, obj.figure, struct('color_map', obj.color_map, 'color_map_name', "")}; + end + obj.fixRendering(); hold(obj.axes, 'off') % This may have been turned on. Does nothing if it wasn't. @@ -196,7 +210,7 @@ function applyScale(obj, ~, ~, upper_limit_box, lower_limit_box, old_scale, new_ obj.color_bar.Ticks = []; color_map = color_map_select; - if ~isstring(color_map_select) && ~ischar(color_map_select) + if ~isstring(color_map_select) && ~ischar(color_map_select) && ~isequal(color_map, false) color_map = get(color_map_select, "Value"); color_map = obj.colormap_choices{color_map}; end @@ -207,13 +221,20 @@ function applyScale(obj, ~, ~, upper_limit_box, lower_limit_box, old_scale, new_ if isnumeric(upper_limit_box) obj.upper_limit = upper_limit_box; else - obj.upper_limit = get(upper_limit_box, "String"); + obj.upper_limit = get(upper_limit_box, 'String'); end if isnumeric(lower_limit_box) obj.lower_limit = lower_limit_box; else - obj.lower_limit = get(lower_limit_box, "String"); + obj.lower_limit = get(lower_limit_box, 'String'); + end + + if isstring(obj.upper_limit) || ischar(obj.upper_limit) + obj.upper_limit = str2double(obj.upper_limit); + end + if isstring(obj.lower_limit) || ischar(obj.lower_limit) + obj.lower_limit = str2double(obj.lower_limit); end if ~isstring(obj.plot_scale) @@ -239,7 +260,11 @@ function applyScale(obj, ~, ~, upper_limit_box, lower_limit_box, old_scale, new_ discrete_colors = NetworkResultPlotParameter().default_discrete_colors; if new_scale == "nla.gfx.ProbPlotMethod.DEFAULT" - new_color_map = NetworkResultPlotParameter.getColormap(discrete_colors, obj.upper_limit, color_map); + if ~isequal(color_map, false) + new_color_map = NetworkResultPlotParameter.getColormap(discrete_colors, obj.upper_limit, color_map); + else + new_color_map = obj.color_map; + end obj.plot_scale = new_scale; elseif new_scale == "nla.gfx.ProbPlotMethod.LOG" new_color_map = NetworkResultPlotParameter.getLogColormap(discrete_colors, obj.matrix, obj.upper_limit, color_map); @@ -337,7 +362,7 @@ function removeLegend(obj) image_height = image_height + 20; end - % colorbar margins + % colorbar marginsobj if obj.draw_colorbar image_width = image_width + obj.colorbar_width + obj.colorbar_offset + obj.colorbar_text_w; end @@ -435,10 +460,10 @@ function addCallback(obj, x) initial_render = false; upper_value = varargin{2}; lower_value = varargin{1}; - if isstring(upper_value) + if isstring(upper_value) || ischar(upper_value) % why are strings not chars??? upper_value = str2double(upper_value); end - if isstring(lower_value) + if isstring(lower_value) || ischar(lower_value) lower_value = str2double(lower_value); end end @@ -677,5 +702,22 @@ function applyColorToData(obj, position_x, position_y, chunk_height, chunk_width obj.image_display.CData(position_y:position_y + chunk_height - 1, position_x + chunk_width, :) =... repelem(chunk_color(1:size(chunk_color, 1), size(chunk_color, 2), :), obj.elementSize(), 1); end + + function adjustScale(obj, src, ~, bounds, plot_figure, parameters, ~) + nla.gfx.scaleSelector(src, bounds, plot_figure, parameters, false, @obj.applyScaleWrapper); + end + + function adjustColor(obj, src, ~, plot_figure, parameters) + nla.gfx.colorSelector(src, plot_figure, parameters, false, @obj.applyScaleWrapper, obj.colormap_choices); + end + + function applyScaleWrapper(obj, ~, ~, upper_limit_box, lower_limit_box, color_map, ~, ~, ~) + % This is used for the edge trimatrix, fc avg which is why we keep the ProbPlotMethod to DEFAULT + if isequal(upper_limit_box, false) + upper_limit_box = obj.upper_limit; + lower_limit_box = obj.lower_limit; + end + obj.applyScale(false, false, upper_limit_box, lower_limit_box, "nla.gfx.ProbPlotMethod.DEFAULT", "nla.gfx.ProbPlotMethod.DEFAULT", color_map) + end end end diff --git a/+nla/+gfx/colorSelector.m b/+nla/+gfx/colorSelector.m new file mode 100644 index 00000000..867459db --- /dev/null +++ b/+nla/+gfx/colorSelector.m @@ -0,0 +1,46 @@ +function colorSelector(src, plot_figure, parameters, chord_type, callback_function, color_choices) + original_figure = src.Parent.Parent; + modal = figure('WindowStyle', 'normal', 'Units', 'pixels', 'Position',... + [original_figure.Position(1), original_figure.Position(2), original_figure.Position(3) / 2, original_figure.Position(4) / 3]); + + % Color Map selector + % Adapted from colormap-dropdown: https://www.mathworks.com/matlabcentral/fileexchange/43659-colormap-dropdown-menu + + color_map_select = uicontrol('Style', 'popupmenu',... + 'Position', [90, 130, 275, 30], "Units", "pixels",... + 'FontName', 'Courier'); + uicontrol("Style", "text", "string", "Colormaps", "Units", "pixels",... + "Position", [color_map_select.Position(1) - 80, color_map_select.Position(2) - 2, 80, color_map_select.Position(4)]); + initial_colors = 16; + colormap_html = {}; + for colors = 1:numel(color_choices) + colormap_function = str2func(strcat(strcat("@(x) ",lower(color_choices{colors})), "(x)")); + CData = colormap_function(initial_colors); + new_html_start = ' '; + new_html = ''; + for color_iterator = initial_colors:-1:1 + hex_code = nla.gfx.rgb2hex([CData(color_iterator, 1), CData(color_iterator, 2),... + CData(color_iterator, 3)]); + new_html = [new_html '__']; + end + new_html_end = [new_html ' ']; + new_html = [new_html_start new_html_end]; + colormap_html = [colormap_html; new_html]; + end + + if ~isfield(parameters, "color_map_name") || ischar(parameters.color_map_name) || isstring(parameters.color_map_name) + parameters.color_map_name = 1; + end + set(color_map_select, "Value", parameters.color_map_name, "String", colormap_html); + + apply_button_position = [10, 10, 100, 30]; + apply_button = uicontrol('String', 'Apply',... + "Callback", {callback_function, false, false, color_map_select, plot_figure, parameters, chord_type},... + "Units", "pixels",... + 'Position', apply_button_position); + + close_button_position = [apply_button.Position(1) + apply_button.Position(3) + 10,... + apply_button.Position(2), apply_button.Position(3), apply_button.Position(4)]; + uicontrol('String', 'Close', 'Callback', @(~, ~)close(modal), "Units", "pixels", 'Position',... + close_button_position); +end \ No newline at end of file diff --git a/+nla/+gfx/scaleSelector.m b/+nla/+gfx/scaleSelector.m new file mode 100644 index 00000000..c4d7c46a --- /dev/null +++ b/+nla/+gfx/scaleSelector.m @@ -0,0 +1,28 @@ +function scaleSelector(src, bounds, plot_figure, parameters, chord_type, callback_function) + original_figure = src.Parent.Parent; + modal = figure('WindowStyle', 'normal', 'Units', 'pixels', 'Position',... + [original_figure.Position(1), original_figure.Position(2), original_figure.Position(3) / 3, original_figure.Position(4) / 3]); + + upper_limit_box = uicontrol('Style', 'edit', "Units", "pixels", 'Position', [90, 130, 100, 30], "String",... + bounds(2)); + upper_limit_box.Position(4) = upper_limit_box.FontSize * 2; + lower_limit_box = uicontrol('Style', 'edit', "Units", "pixels", 'Position', [90, 100, 100, 30], "String",... + bounds(1)); + lower_limit_box.Position(4) = lower_limit_box.FontSize * 2; + + uicontrol('Style', 'text', 'String', 'Upper Limit', "Units", "pixels", 'Position',... + [upper_limit_box.Position(1) - 80, upper_limit_box.Position(2) - 2, 80, upper_limit_box.Position(4)]); + uicontrol('Style', 'text', 'String', 'Lower Limit', "Units", "pixels", 'Position',... + [lower_limit_box.Position(1) - 80, lower_limit_box.Position(2) - 2, 80, lower_limit_box.Position(4)]); + + apply_button_position = [10, 10, 100, 30]; + apply_button = uicontrol('String', 'Apply',... + "Callback", {callback_function, upper_limit_box, lower_limit_box, false, plot_figure, parameters, chord_type},... + "Units", "pixels",... + 'Position', apply_button_position); + + close_button_position = [apply_button.Position(1) + apply_button.Position(3) + 10,... + apply_button.Position(2), apply_button.Position(3), apply_button.Position(4)]; + uicontrol('String', 'Close', 'Callback', @(~, ~)close(modal), "Units", "pixels", 'Position',... + close_button_position); +end \ No newline at end of file diff --git a/+nla/+inputField/NetworkAtlasFuncConn.m b/+nla/+inputField/NetworkAtlasFuncConn.m index 0f1a47f8..775bc08d 100755 --- a/+nla/+inputField/NetworkAtlasFuncConn.m +++ b/+nla/+inputField/NetworkAtlasFuncConn.m @@ -322,8 +322,9 @@ function buttonViewFCAvgClickedCallback(obj) fc_avg = copy(obj.func_conn); fc_avg.v = mean(fc_avg.v, 2); fig_l = nla.gfx.createFigure(); + matrix_plot = nla.gfx.plots.MatrixPlot(fig_l, 'FC Average (Fisher Z(R))', fc_avg, obj.net_atlas.nets,... - nla.gfx.FigSize.LARGE); + nla.gfx.FigSize.LARGE, "app_plot", false); fig_l.Position(3) = matrix_plot.image_dimensions("image_width"); fig_l.Position(4) = matrix_plot.image_dimensions("image_height"); matrix_plot.displayImage(); diff --git a/+nla/+net/+result/+chord/ChordPlotter.m b/+nla/+net/+result/+chord/ChordPlotter.m index 27272895..15ff4165 100644 --- a/+nla/+net/+result/+chord/ChordPlotter.m +++ b/+nla/+net/+result/+chord/ChordPlotter.m @@ -9,6 +9,8 @@ axis_width = 750; % Constant for the size of the chord trimatrix_width = 500; % Constant for the size of the Trimatrix plotted with bottom_text_height = 250; % How far from the bottom of the trimatrix the text appears + colormap_choices = {"Parula", "Turbo", "HSV", "Hot", "Cool", "Spring", "Summer", "Autumn", "Winter", "Gray",... + "Bone", "Copper", "Pink"}; % Colorbar choices end properties @@ -16,6 +18,7 @@ edge_test_result % Edge test results split_plot = false % This is an option that is set automatically during operation. edge_plot_type = "nla.gfx.EdgeChordPlotMethod.PROB" % Default chord type for edges + chord_plotter = false end methods @@ -30,11 +33,14 @@ end end - function generateChordFigure(obj, parameters, chord_type) + function generateChordFigure(obj, parameters, chord_type, parent_figure) % generateChordFigure plots chords for a network test import nla.gfx.SigType nla.net.result.plot.PermutationTestPlotter nla.gfx.EdgeChordPlotMethod nla.gfx.setTitle coefficient_bounds = [0, parameters.p_value_plot_max]; + if isfield(parameters, "lower_bound") + coefficient_bounds(1) = parameters.lower_bound; + end if parameters.significance_type == SigType.INCREASING && parameters.p_value_plot_max < 1 coefficient_bounds = [parameters.p_value_plot_max, 1]; end @@ -54,6 +60,10 @@ function generateChordFigure(obj, parameters, chord_type) plot_figure = nla.gfx.createFigure(obj.axis_width , obj.axis_width); end + if ~isequal(parent_figure, false) + nla.gfx.moveFigToParentUILocation(plot_figure, parent_figure); + end + % Plot a standard chord plot if chord_type == "nla.PlotType.CHORD" figure_axis = axes(plot_figure, 'Units', 'pixels', 'Position', [0, 0, obj.axis_width,... @@ -68,26 +78,38 @@ function generateChordFigure(obj, parameters, chord_type) % thresholding below the "insignificance" value statistic_matrix = copy(parameters.statistic_plot_matrix); statistic_matrix.v(~parameters.significance_plot.v) = insignificance; - chord_plotter = nla.gfx.chord.ChordPlot(obj.network_atlas, figure_axis, 500, statistic_matrix,... + obj.chord_plotter = nla.gfx.chord.ChordPlot(obj.network_atlas, figure_axis, 500, statistic_matrix,... 'color_map', parameters.color_map, 'direction', parameters.significance_type, 'upper_limit',... coefficient_bounds(2), 'lower_limit', coefficient_bounds(1), 'chord_type', chord_type); - chord_plotter.drawChords(); + obj.chord_plotter.drawChords(); setTitle(figure_axis, parameters.name_label) + settings_menu = uimenu(plot_figure, 'Text', 'Settings'); + change_scale_option = uimenu(settings_menu,'Text','Change Scale'); + change_scale_option.MenuSelectedFcn = {@obj.adjustScale, coefficient_bounds, plot_figure, parameters, chord_type}; + change_color_map = uimenu(settings_menu, 'Text', 'Change Color Map'); + change_color_map.MenuSelectedFcn = {@obj.adjustColor, plot_figure, parameters, chord_type}; else % Plot edge chord - obj.generateEdgeChordFigure(plot_figure, parameters, chord_type) + obj.generateEdgeChordFigure(plot_figure, parameters, chord_type, parent_figure) end + + end end methods (Access = protected) - function generateEdgeChordFigure(obj, plot_figure, parameters, chord_type) + function generateEdgeChordFigure(obj, plot_figure, parameters, chord_type, parent_figure) % generateEdgeChordFigure generates the edge chord plotting import nla.gfx.EdgeChordPlotMethod nla.gfx.setTitle - range_limit = std(obj.edge_test_result.coeff.v) * 5; - coefficient_min = -range_limit; - coefficient_max = range_limit; + if isfield(parameters, "lower_bound") + coefficient_min = parameters.lower_bound; + coefficient_max = parameters.p_value_plot_max; + else + range_limit = std(obj.edge_test_result.coeff.v) * 5; + coefficient_min = -range_limit; + coefficient_max = range_limit; + end clipped_values = nla.TriMatrix(obj.network_atlas.numROIs(), nla.TriMatrixDiag.REMOVE_DIAGONAL); clipped_values.v = obj.edge_test_result.coeff.v; @@ -96,7 +118,7 @@ function generateEdgeChordFigure(obj, plot_figure, parameters, chord_type) clipped_values_positive.v = obj.edge_test_result.coeff.v; clipped_values_positive.v(obj.edge_test_result.coeff.v < 0) = 0; - color_map = turbo(1000); + color_map = parula(1000); significance_type = "nla.gfx.SigType.ABS_INCREASING"; insignificance = 0; % This is basically the background for the plot % This is the title for the positive (or non-split) chord plot @@ -110,21 +132,39 @@ function generateEdgeChordFigure(obj, plot_figure, parameters, chord_type) switch obj.edge_plot_type case "nla.gfx.EdgeChordPlotMethod.COEFF" main_title = positive_title; + if isfield(parameters, "lower_bound") + coefficient_min = parameters.lower_bound; + coefficient_max = parameters.p_value_plot_max; + end case "nla.gfx.EdgeChordPlotMethod.COEFF_SPLIT" main_title = negative_title; positive_main_title = positive_title; + if isfield(parameters, "lower_bound") + coefficient_min = parameters.lower_bound; + coefficient_max = parameters.p_value_plot_max; + end case "nla.gfx.EdgeChordPlotMethod.COEFF_BASE_SPLIT" - coefficient_min = obj.edge_test_result.coeff_range(1); - coefficient_max = obj.edge_test_result.coeff_range(2); + if isfield(parameters, "lower_bound") + coefficient_min = parameters.lower_bound; + coefficient_max = parameters.p_value_plot_max; + else + coefficient_min = obj.edge_test_result.coeff_range(1); + coefficient_max = obj.edge_test_result.coeff_range(2); + end main_title = negative_title; positive_main_title = positive_title; case "nla.gfx.edgeChordPlotMethod.COEFF_BASE" - coefficient_min = obj.edge_test_result.coeff_range(1); - coefficient_max = obj.edge_test_result.coeff_range(2); + if isfield(parameters, "lower_bound") + coefficient_min = parameters.lower_bound; + coefficient_max = parameters.p_value_plot_max; + else + coefficient_min = obj.edge_test_result.coeff_range(1); + coefficient_max = obj.edge_test_result.coeff_range(2); + end main_title = positive_title; @@ -134,13 +174,19 @@ function generateEdgeChordFigure(obj, plot_figure, parameters, chord_type) clipped_values.v = obj.edge_test_result.prob.v; significance_type = "nla.gfx.SigType.DECREASING"; - coefficient_min = 0; - coefficient_max = obj.edge_test_result.prob_max; + if isfield(parameters, "lower_bound") + coefficient_min = parameters.lower_bound; + coefficient_max = parameters.p_value_plot_max; + else + coefficient_min = 0; + coefficient_max = obj.edge_test_result.prob_max; + end insignificance = 1; main_title = sprintf("Edge-level P-values (P < %g) (Within Significant Net-Pair)",... obj.edge_test_result.prob_max); end + coefficient_bounds = [coefficient_min, coefficient_max]; % Filtering/Thresholding out values for network1 = 1:obj.network_atlas.numNets() @@ -165,8 +211,8 @@ function generateEdgeChordFigure(obj, plot_figure, parameters, chord_type) obj.edge_plot_type == "nla.gfx.EdgeChordPlotMethod.COEFF_SPLIT" || obj.edge_plot_type == "nla.gfx.EdgeChordPlotMethod.COEFF_BASE_SPLIT"... ) positive_chord_plotter = nla.gfx.chord.ChordPlot(obj.network_atlas, plot_axis, 450, clipped_values_positive,... - 'direction', significance_type, 'chord_type', chord_type, 'color_map', color_map, 'lower_limit',... - coefficient_min, 'upper_limit', coefficient_max); + 'direction', significance_type, 'chord_type', chord_type, 'color_map', parameters.color_map, 'lower_limit',... + coefficient_bounds(1), 'upper_limit', coefficient_bounds(2)); positive_chord_plotter.drawChords(); setTitle(plot_axis, positive_main_title); @@ -177,12 +223,12 @@ function generateEdgeChordFigure(obj, plot_figure, parameters, chord_type) plot_axis.Visible = true; end - chord_plotter = nla.gfx.chord.ChordPlot(obj.network_atlas, plot_axis, 450, clipped_values, 'chord_type', chord_type,... - 'direction', significance_type, 'color_map', color_map, 'lower_limit', coefficient_min, 'upper_limit', coefficient_max); - chord_plotter.drawChords(); + obj.chord_plotter = nla.gfx.chord.ChordPlot(obj.network_atlas, plot_axis, 450, clipped_values, 'chord_type', chord_type,... + 'direction', significance_type, 'color_map', parameters.color_map, 'lower_limit', coefficient_bounds(1), 'upper_limit', coefficient_bounds(2)); + obj.chord_plotter.drawChords(); setTitle(plot_axis, main_title); - colormap(plot_axis, color_map); + colormap(plot_axis, parameters.color_map); color_bar = colorbar(plot_axis); color_bar.Units = 'pixels'; color_bar.Location = 'east'; @@ -198,6 +244,40 @@ function generateEdgeChordFigure(obj, plot_figure, parameters, chord_type) labels{tick + 1} = sprintf("%.2g", coefficient_min + (tick * ((coefficient_max - coefficient_min) / number_ticks))); end color_bar.TickLabels = labels; + + settings_menu = uimenu(plot_figure, 'Text', 'Settings'); + change_scale_option = uimenu(settings_menu,'Text','Change Scale'); + change_scale_option.MenuSelectedFcn = {@obj.adjustScale, coefficient_bounds, plot_figure, parameters, chord_type}; + change_color_map = uimenu(settings_menu, 'Text', 'Change Color Map'); + change_color_map.MenuSelectedFcn = {@obj.adjustColor, plot_figure, parameters, chord_type}; + end + + function adjustScale(obj, src, ~, bounds, plot_figure, parameters, chord_type) + nla.gfx.scaleSelector(src, bounds, plot_figure, parameters, chord_type, @obj.applyScale); + end + + function adjustColor(obj, src, ~, plot_figure, parameters, chord_type) + nla.gfx.colorSelector(src, plot_figure, parameters, chord_type, @obj.applyScale, obj.colormap_choices); + end + + function applyScale(obj, src, ~, upper_limit_box, lower_limit_box, color_map, plot_figure, parameters, chord_type) + + if ~isequal(upper_limit_box, false) + parameters.p_value_plot_max = str2double(get(upper_limit_box, "String")); + parameters.lower_bound = str2double(get(lower_limit_box, "String")); + end + + if ~isequal(color_map, false) + color_map = get(color_map, "Value"); + color_map_name = str2func(lower(obj.colormap_choices{color_map})); + parameters.color_map = flip(color_map_name(1000)); + parameters.color_map_name = color_map; + end + + obj.generateChordFigure(parameters, chord_type, plot_figure) + + close(plot_figure); + close(src.Parent); end end end \ No newline at end of file diff --git a/+nla/+net/+result/+plot/NetworkTestPlotApp.mlapp b/+nla/+net/+result/+plot/NetworkTestPlotApp.mlapp index 17c2e792961d3402f226cf20e190dce4f4905095..58732f76169260c30217b4894d6a875777a874b0 100644 GIT binary patch delta 39437 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 delta 39477 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 d00000000010000000oGX8>J-%;i3Ql008V@ERz5L diff --git a/+nla/+net/+result/+plot/NetworkTestPlotApp_exported.m b/+nla/+net/+result/+plot/NetworkTestPlotApp_exported.m index ba7b11aa..42ce990b 100644 --- a/+nla/+net/+result/+plot/NetworkTestPlotApp_exported.m +++ b/+nla/+net/+result/+plot/NetworkTestPlotApp_exported.m @@ -24,9 +24,9 @@ MultipleComparisonCorrectionDropDown matlab.ui.control.DropDown ROIcentroidsonbrainplotsCheckBox matlab.ui.control.CheckBox ViewNetChordPlotsButton matlab.ui.control.Button - CohensDThresholdCheckBox matlab.ui.control.CheckBox ViewEdgeChordPlotsButton matlab.ui.control.Button EdgeChordPlotTypeDropDownLabel matlab.ui.control.Label + CohensDThresholdCheckBox matlab.ui.control.CheckBox EdgeChordPlotTypeDropDown matlab.ui.control.DropDown ViewConvergenceMapButton matlab.ui.control.Button ConvergencePlotColorDropDownLabel matlab.ui.control.Label @@ -322,7 +322,7 @@ function drawChords(app, event) chord_plotter = nla.net.result.chord.ChordPlotter(app.edge_test_options.net_atlas, app.edge_test_result); probability_parameters.edge_chord_plot_method = app.EdgeChordPlotTypeDropDown.Value; - chord_plotter.generateChordFigure(probability_parameters, plot_type) + chord_plotter.generateChordFigure(probability_parameters, plot_type, app.UIFigure) end % Value changed function: ColormapDropDown, @@ -602,13 +602,6 @@ function createComponents(app) app.ViewNetChordPlotsButton.Position = [263 82 140 22]; app.ViewNetChordPlotsButton.Text = 'View Net Chord Plots'; - % Create CohensDThresholdCheckBox - app.CohensDThresholdCheckBox = uicheckbox(app.Panel); - app.CohensDThresholdCheckBox.Enable = 'off'; - app.CohensDThresholdCheckBox.Visible = 'off'; - app.CohensDThresholdCheckBox.Text = 'Cohen''s D Threshold'; - app.CohensDThresholdCheckBox.Position = [402 4 134 22]; - % Create ViewEdgeChordPlotsButton app.ViewEdgeChordPlotsButton = uibutton(app.Panel, 'push'); app.ViewEdgeChordPlotsButton.ButtonPushedFcn = createCallbackFcn(app, @ViewEdgeChordPlotsButtonPushed, true); @@ -621,6 +614,13 @@ function createComponents(app) app.EdgeChordPlotTypeDropDownLabel.Position = [13 150 123 22]; app.EdgeChordPlotTypeDropDownLabel.Text = 'Edge Chord Plot Type'; + % Create CohensDThresholdCheckBox + app.CohensDThresholdCheckBox = uicheckbox(app.Panel); + app.CohensDThresholdCheckBox.Enable = 'off'; + app.CohensDThresholdCheckBox.Visible = 'off'; + app.CohensDThresholdCheckBox.Text = 'Cohen''s D Threshold'; + app.CohensDThresholdCheckBox.Position = [402 4 134 22]; + % Create EdgeChordPlotTypeDropDown app.EdgeChordPlotTypeDropDown = uidropdown(app.Panel); app.EdgeChordPlotTypeDropDown.Items = {};