MPI plotting stuff

This commit is contained in:
Silas Oettinghaus
2026-07-15 23:02:05 +02:00
parent 9455084711
commit 2e667d6ec3
7 changed files with 707 additions and 33 deletions

View File

@@ -5,8 +5,14 @@ arguments
options.fignum (1,1) double = NaN % Default to NaN if not provided
options.displayname (1,:) char = '' % Default to an empty string if not provided
options.color = [];
options.colormode (1,1) string {mustBeMember(options.colormode, ["diverging", "qualitative", "paired"])} = "diverging";
end
persistent nextGroupIdx
if isempty(nextGroupIdx)
nextGroupIdx = 0;
end
% Determine the figure number to use or create a new figure
if isnan(options.fignum)
fig = figure; % Create a new figure and get its handle
@@ -15,16 +21,16 @@ end
end
hold on
ax = gca;
% N = numel(ax.Children);
if isempty(options.color)
N = sum(arrayfun(@(x) strcmp(x.LineStyle, '-'), ax.Children));
cmap = linspecer(8);
options.color = cmap(mod(N, size(cmap, 1)) + 1, :);
linesBefore = findall(ax, 'Type', 'Line');
useAutomaticColor = isempty(options.color);
if useAutomaticColor
options.color = selectEQNoisePSDColor(ax, options.colormode);
end
% Ensure the figure is ready before calling spectrum
eq_noise = eq_noise - mean(eq_noise.signal);
eq_noise.spectrum("displayname", options.displayname, "fignum", fig.Number, "normalizeTo0dB", 0,"color",options.color,"fft_length",4096*2);
eq_noise.spectrum("displayname", options.displayname, "fignum", fig.Number, "normalizeTo0dB", 0,"color",options.color,"fft_length",4096);
if ~isnan(options.postfilter_taps)
% Hold on to the figure for further plotting
@@ -44,7 +50,88 @@ end
legend('show');
end
if useAutomaticColor
nextGroupIdx = nextGroupIdx + 1;
newLines = getNewLines(ax, linesBefore);
tagEQNoisePSDLines(newLines, nextGroupIdx);
recolorEQNoisePSDLines(ax, options.colormode);
end
xlim([-eq_noise.fs/2* 1e-9 eq_noise.fs/2* 1e-9]);
% ylim([-15, 0]);
end
function color = selectEQNoisePSDColor(ax, colormode)
if colormode == "qualitative"
N = sum(arrayfun(@(x) strcmp(x.LineStyle, '-'), ax.Children));
cmap = linspecer(8);
color = cmap(mod(N, size(cmap, 1)) + 1, :);
else
color = [0 0 0];
end
end
function newLines = getNewLines(ax, linesBefore)
linesAfter = findall(ax, 'Type', 'Line');
newLines = linesAfter(~ismember(linesAfter, linesBefore));
end
function tagEQNoisePSDLines(lines, groupIdx)
for lineIdx = 1:numel(lines)
setappdata(lines(lineIdx), 'showEQNoisePSDGroupIdx', groupIdx);
end
end
function recolorEQNoisePSDLines(ax, colormode)
if colormode == "qualitative"
return
end
lines = findall(ax, 'Type', 'Line');
groupIdx = NaN(size(lines));
for lineIdx = 1:numel(lines)
if isappdata(lines(lineIdx), 'showEQNoisePSDGroupIdx')
groupIdx(lineIdx) = getappdata(lines(lineIdx), 'showEQNoisePSDGroupIdx');
end
end
lines = lines(~isnan(groupIdx));
groupIdx = groupIdx(~isnan(groupIdx));
if isempty(lines)
return
end
groups = unique(groupIdx, 'stable');
groups = sort(groups);
cols = getEQNoisePSDColormap(colormode, numel(groups));
for groupColorIdx = 1:numel(groups)
sameGroup = groupIdx == groups(groupColorIdx);
set(lines(sameGroup), 'Color', cols(groupColorIdx, :));
end
end
function cols = getEQNoisePSDColormap(colormode, numColors)
switch colormode
case "paired"
cols = cbrewer2('paired', numColors);
otherwise
cols = getDivergingWithoutBrightCenter(numColors);
end
end
function cols = getDivergingWithoutBrightCenter(numColors)
numBaseColors = max(6, numColors);
centerExcludeFraction = 0.3;
baseCols = cbrewer2('RdYlBu', numBaseColors);
centerIdx = (numBaseColors + 1) / 2;
excludeHalfWidth = centerExcludeFraction * numBaseColors / 2;
keepIdx = find(abs((1:numBaseColors) - centerIdx) > excludeHalfWidth);
sampleIdx = round(linspace(1, numel(keepIdx), numColors));
cols = baseCols(keepIdx(sampleIdx), :);
end