Use imhist in tiled layout

12 views (last 30 days)
Jacob
Jacob on 12 Jul 2023
Commented: Voss on 12 Jul 2023
I am trying to plot an image histogram in a tiled layout with the pictures of the images in the same figure. currently I have
B = imread('building.jpg');
Grayimg = rgb2gray(B);
tiledlayout(2, 2);
nexttile;
imshow(B);
nexttile;
imshow(Grayimg);
nexttile;
imhist(Grayimg);
and I get the error Warning: Unable to set 'Position', 'Inner Position', 'OuterPosition', or ActivePositionProperty' for objects in a TiledChartLayout.
The figure that is output has the grayscale part of the histogram in tile 1, and the histogram in tile 3. I want the whole "imhist output" in one tile. How can I do this? It doesn't sem to like imhist for some reason.
Thank you,
Jake

Accepted Answer

Voss
Voss on 12 Jul 2023
You're right, imhist doesn't seem to be very compatible with tiledlayout.
Here's a workaround that might work for you:
% B = imread('building.jpg');
B = imread('peppers.png');
Grayimg = rgb2gray(B);
f1 = figure();
tiledlayout(2, 2);
nexttile;
imshow(B);
nexttile;
imshow(Grayimg);
% make the nexttile, just to store its position:
ax1 = nexttile;
ax1_pos = ax1.Position;
delete(ax1);
% imhist() into a new figure:
f2 = figure();
imhist(Grayimg);
% copy the two imhist axes into the first figure:
ax1 = copyobj(gca(),f1);
ax_cs1 = copyobj(findall(f2,'Tag','colorstripe'),f1);
% and adjust the copies' positions to fit where the nexttile was:
ax_cs1.Position = [ax1_pos([1 2 3]) ax1_pos(4)*ax_cs1.Position(4)];
ax1.Position = [ax1_pos(1) ax1_pos(2)+ax_cs1.Position(4) ax1_pos(3) ax1_pos(4)-ax_cs1.Position(4)];
% finally, delete the separate imhist figure
delete(f2);
  2 Comments
Jacob
Jacob on 12 Jul 2023
Edited: Jacob on 12 Jul 2023
awesome, that worked! Thanks for the workaround. Is 'Tag' and 'Colorstripe' just what that grayscale is called by MATLAB?
Also, just for my own curiosity, how did you know the position of the grayscale? - i.e. ax_cs1.Position(4)?
Voss
Voss on 12 Jul 2023
Yes, apparently, 'colorstripe' is the Tag given by MATLAB to the grayscale axes. I found that out by first doing findall(f2) to see what all was in an imhist plot.
ax_cs1.Position is the position of the colorstripe/grayscale axes; ax_cs.Position(4) is its height. Since its Units are 'normalized' I multiply by the height of the original nexttile axes (which is also 'normalized') height ax1_pos(4) to get the final height.

Sign in to comment.

More Answers (0)

Categories

Find more on Color and Styling in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!