is it possible to mark significance levels using heatmap?

8 views (last 30 days)
I have a matrix with my data and a matrix with pvalues, is it possible to overlay pvalues under a specified threshold (i.e. .05) onto the heatmap, using a symble (e.g. *), or even the text value.

Accepted Answer

Drew
Drew on 30 Oct 2024
Text cannot be a child of HeatmapChart, so as an alternative, could use imagesc.
If this answer helps you, please remember to accept the answer.
% Example data matrix and p-value matrix
dataMatrix = rand(10); % Replace with your data matrix
pValueMatrix = rand(10); % Replace with your p-value matrix
% Threshold for p-values
pValueThreshold = 0.1;
% Create a figure and axes
figure;
imagesc(dataMatrix); % Use imagesc to display the data matrix as a heatmap
colormap(sky);
colorbar;
% Get the size of the data matrix
[numRows, numCols] = size(dataMatrix);
% Loop through each element in the matrix
for row = 1:numRows
for col = 1:numCols
% Display the data value
dataValueStr = num2str(dataMatrix(row, col), '%.2f');
text(col, row, dataValueStr, 'HorizontalAlignment', 'center', ...
'VerticalAlignment', 'bottom', 'Color', 'black', 'FontSize', 10);
% Check if the p-value is below the threshold
if pValueMatrix(row, col) < pValueThreshold
% Overlay a symbol or p-value text on the heatmap
% Use '*' for symbol or num2str(pValueMatrix(row, col)) for text
pValueStr = '*'; % Change to num2str(pValueMatrix(row, col)) to show p-value
text(col, row, pValueStr, 'HorizontalAlignment', 'center', ...
'VerticalAlignment', 'top', 'Color', 'red', 'FontSize', 12);
end
end
end
% Set axis labels and title
xlabel('Columns');
ylabel('Rows');
title('Heatmap with Data Values and Significant P-values');
% Adjust the axis to display correctly
set(gca, 'XTick', 1:numCols, 'YTick', 1:numRows);
axis equal tight;
  1 Comment
Emu
Emu on 7 Nov 2024
Thank you ! both of these worked but this answer provided the format I wanted.

Sign in to comment.

More Answers (1)

Voss
Voss on 30 Oct 2024
As far as I know, there is no built-in option to conditionally alter the heatmap data labels, but what you can do is create a heatmap with no data labels and create an additional invisible axes on top containing text objects that you can manipulate at will.
Example:
data = 100*rand(5)
data = 5×5
91.7670 66.2194 9.8986 83.5310 96.9522 63.0690 13.5828 47.6867 40.9138 7.2952 48.4783 92.8572 35.7252 97.9216 81.5112 10.8300 96.9977 41.8516 32.0662 9.2124 7.4585 28.4586 80.6638 16.3520 14.3313
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
p = 0.5*rand(5)
p = 5×5
0.3685 0.0560 0.2255 0.0459 0.0255 0.0094 0.0308 0.3124 0.0829 0.2498 0.3161 0.4574 0.4442 0.3291 0.2433 0.0540 0.3828 0.2185 0.2170 0.2821 0.1825 0.0940 0.0910 0.4831 0.2659
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
h = heatmap(data,'CellLabelColor','none');
str = compose('%0.4g\np=%0.2g',data(:),p(:));
idx = p(:) < 0.05;
str(idx) = strcat(str(idx),'*');
ax = axes( ...
'Visible','off', ...
'Units',h.Units, ...
'Position',h.Position, ...
'YDir','reverse');
[x,y] = meshgrid(categorical(h.XData),categorical(h.YData));
text(ax,x(:),y(:),str,'HorizontalAlignment','center')

Categories

Find more on Data Distribution Plots in Help Center and File Exchange

Products


Release

R2024b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!