84 lines
3.0 KiB
Matlab
84 lines
3.0 KiB
Matlab
function plotPhaseDiagramWithBoundaries(M, SCATTERING_LENGTH_RANGE, NUM_ATOMS_LIST, PhaseBoundary, TitleString)
|
|
|
|
% plotPhaseDiagramWithBoundaries - Plots a phase diagram with overlaid interpolated boundaries
|
|
%
|
|
% Inputs:
|
|
% PhaseDiagramMatrix - 2D matrix of phase values
|
|
% NumberOfAtoms - Vector of atom numbers (x-axis)
|
|
% ScatteringLengths - Vector of scattering lengths (y-axis)
|
|
% PhaseBoundary_Untilted - Object containing selected boundary points
|
|
% TitleString - Title string for the plot
|
|
%
|
|
% This function displays the interpolated phase diagram and overlays
|
|
% boundary curves extracted from user-selected points.
|
|
|
|
% Extract boundary point sets
|
|
rawPoints = PhaseBoundary.SelectedPoints.values;
|
|
if iscell(rawPoints)
|
|
pointSets = rawPoints;
|
|
else
|
|
pointSets = {rawPoints};
|
|
end
|
|
|
|
regionNames = ["Unmodulated", "SSD", "Stripe", "Labyrinth", "Honeycomb"];
|
|
regionColors = [
|
|
0.8 0.8 0.8;
|
|
0.2 0.6 1.0;
|
|
0.2 0.8 0.2;
|
|
1.0 0.6 0.2;
|
|
0.8 0.2 0.8
|
|
];
|
|
|
|
[X, Y] = meshgrid(NUM_ATOMS_LIST, SCATTERING_LENGTH_RANGE);
|
|
[Xq, Yq] = meshgrid(linspace(min(NUM_ATOMS_LIST), max(NUM_ATOMS_LIST), 500), ...
|
|
linspace(min(SCATTERING_LENGTH_RANGE), max(SCATTERING_LENGTH_RANGE), 500));
|
|
Mq = interp2(X, Y, M, Xq, Yq, 'nearest');
|
|
|
|
fig = figure('Color', 'w'); clf;
|
|
set(fig, 'Position', [100, 100, 1050, 800], 'Renderer', 'opengl');
|
|
ax = axes('Parent', fig, 'Position', [0.1 0.15 0.75 0.8]);
|
|
|
|
imagesc(ax, [min(NUM_ATOMS_LIST), max(NUM_ATOMS_LIST)], ...
|
|
[min(SCATTERING_LENGTH_RANGE), max(SCATTERING_LENGTH_RANGE)], Mq);
|
|
set(ax, 'YDir', 'normal');
|
|
colormap(ax, regionColors);
|
|
cb = colorbar('Ticks', 0:4, 'TickLabels', regionNames, 'FontSize', 12);
|
|
cb.Color = 'k'; % set colorbar text color
|
|
clim(ax, [0 4]);
|
|
hold(ax, 'on');
|
|
xlabel(ax, 'Number of Atoms', 'FontSize', 16);
|
|
ylabel(ax, 'Scattering Length (\times a_o)', 'FontSize', 16,'Interpreter', 'tex');
|
|
t = title(ax, TitleString, 'FontSize', 18, 'Interpreter', 'tex');
|
|
t.Color = 'k'; % force title color to black
|
|
set(ax, 'FontSize', 16, 'Color', 'none');
|
|
axis(ax, 'tight');
|
|
grid(ax, 'on');
|
|
|
|
% Overlay curves
|
|
hold on;
|
|
for i = 1:numel(pointSets)
|
|
pts = pointSets{i};
|
|
x = pts(:,1) * 1e5; % convert back to # of atoms scale
|
|
y = pts(:,2);
|
|
|
|
% Interpolation
|
|
[x, idx] = sort(x); y = y(idx);
|
|
dist = sqrt(diff(x).^2 + diff(y).^2);
|
|
t = [0; cumsum(dist)];
|
|
t = t / t(end);
|
|
t_fine = linspace(0, 1, 1000);
|
|
x_smooth = interp1(t, x, t_fine, 'makima');
|
|
y_smooth = interp1(t, y, t_fine, 'makima');
|
|
|
|
% Plot smooth curve
|
|
plot(x_smooth, y_smooth, 'k-', 'LineWidth', 2);
|
|
end
|
|
|
|
set(gca, 'FontSize', 16, ...
|
|
'XColor', 'k', 'YColor', 'k', ...
|
|
'Color', 'none');
|
|
axis tight;
|
|
grid on;
|
|
|
|
end
|