- 'outerposition' — The OuterPosition property remains constant when you add, remove, or change decorations such as a title or an axis label. If any positional adjustments are needed, MATLAB adjusts the InnerPosition property.
- 'innerposition' — The InnerPosition property remains constant when you add, remove, or change decorations such as a title or an axis label. If any positional adjustments are needed, MATLAB adjusts the OuterPosition property.
changing YLabel position and outerposition
조회 수: 87 (최근 30일)
이전 댓글 표시
If YLabel position change that outerposition mode of axes don't work for YLabel.
It's correct?
figure;
ax1 = axes('OuterPosition',[0 0.50 1.0 0.50]);
ax1.ActivePositionProperty = 'outerposition';
plot(ax1,0:10,0:10);
ax1.Title.String = 'Preserve OuterPosition';
ax1.YLabel.Rotation = 0;
ax1.YLabel.String = 'Preserve OuterPosition';
ax1.YLabel.HorizontalAlignment = 'right';
ax1.YLabel.VerticalAlignment = 'top';
ax1.YLabel.Position(2) = ax1.YLabel.Position(2)+2; % outerposition mode of axes don't work for YLabel after the line
ax1.YLabel.HorizontalAlignment = 'right';
ax1.YLabel.VerticalAlignment = 'top';
outerpos = ax1.OuterPosition;
ti = ax1.TightInset;
left = outerpos(1) + ti(1);
bottom = outerpos(2) + ti(2);
ax_width = outerpos(3) - ti(1) - ti(3);
ax_height = outerpos(4) - ti(2) - ti(4);
ax1.Position = [left bottom ax_width ax_height];
댓글 수: 1
Adam Danz
2020년 6월 5일
https://www.mathworks.com/help/matlab/creating_plots/automatic-axes-resize.html are used ActivePositionProperty which is not recommended starting in R2020a
But I think ActivePositionProperty is similar PositionConstraint. I changed ActivePositionProperty to PositionConstraint but the problem didn't gone.
The description of PositionConstraint says:
Position property to hold constant when adding, removing, or changing decorations, specified as one of the following values:
So when I setup PositionConstraint to 'outerposition' I can change property Position of YLabel.
So matlab's help permit me to use my code but Matlab work invalid.
The below picture are shown the figure before changing position of YLabel. PositionConstraint set by 'outerposition' and Matlab work right.
The below picture are shown the figure after changing position of YLabel. PositionConstraint set by 'outerposition' and Matlab work invalid.
The below picture are shown the figure after changing position of YLabel if Matlab would be right
채택된 답변
Adam Danz
2020년 6월 5일
편집: Adam Danz
2023년 3월 17일
Source of the problem (scroll down for solution)
TL;DR: Changing the position of the y-axis label triggers an axis resize that doesn't account for rotated y-axis labels.
Here's a demo similar to yours that illustrates the problem.
1) Create an axes with a y-axis label in its default orientation. Draw a red rectangle around the OuterPosition of the axes and a green rectangle around the Position/InnerPosition of the axes.
figure('color', 'w', 'MenuBar', 'none');
ax1 = axes('OuterPosition',[.25 0.40 .7 0.50]);
ax1.ActivePositionProperty = 'outerposition';
plot(ax1,0:10,0:10);
ax1.Title.String = 'Preserve OuterPosition';
ax1.YLabel.String = 'Preserve OuterPosition';
ah(1) = annotation('rectangle',ax1.OuterPosition,'Color', 'r','LineWidth',2);
ah(2) = annotation('rectangle',ax1.Position,'Color','g','LineWidth',2);
2) Rotate the y-axis label and set alignment. Draw blue dashed rectangles showing the updated position properties.
ax1.YLabel.Rotation = 0;
ax1.YLabel.HorizontalAlignment = 'right';
ax1.YLabel.VerticalAlignment = 'top';
ah(3) = annotation('rectangle',ax1.OuterPosition, 'Color', 'b', 'LineStyle','--','LineWidth',2);
ah(4) = annotation('rectangle',ax1.Position, 'Color', 'b','lineStyle','--','LineWidth',2);
As you can see, the OuterPosition propery is preserved and the Position/InnerPosition properties have been adapted to the rotated y-axis label.
3) Change the vertical position of the y-axis label. Draw black dotted rectangles showing the updated position properties.
ax1.YLabel.Position(2) = ax1.YLabel.Position(2)+2; % outerposition mode of axes don't work for YLabel after the line
ah(5) = annotation('rectangle',ax1.OuterPosition, 'Color', 'k', 'LineStyle',':','LineWidth',3);
ah(6) = annotation('rectangle',ax1.Position, 'Color', 'k','lineStyle',':','LineWidth',3);
As you can see, the original position property values have been returned as if the y-axis label were still oriented at 90 degrees.
Solution to the problem
Record the Position value of the axes prior to changing the y-axis label position. After changing the y-axis label position, reset the axes to its original position.
This is applied to the code from your demo.
figure;
ax1 = axes('OuterPosition',[0 0.50 1.0 0.50]);
plot(ax1,0:10,0:10);
ax1.Title.String = 'Preserve OuterPosition';
ax1.YLabel.String = 'Preserve OuterPosition';
ax1.YLabel.Rotation = 0;
ax1.YLabel.HorizontalAlignment = 'right';
ax1.YLabel.VerticalAlignment = 'top';
prePosition = ax1.Position; % RECORD THE POSITION OF THE AXES PRIOR TO LABEL POSITION CHANGE
ax1.YLabel.Position(2) = ax1.YLabel.Position(2)+2; % outerposition mode of axes don't work for YLabel after the line
ax1.Position = prePosition; % RESET THE AXIS POSITION
Update
Starting in MATLAB R2023a when you change the Rotation property of an axis label in a 2-D plot, the HorizontalAlignment and the VerticalAlignment properties of the label automatically update to prevent overlap between the label and the axes.
댓글 수: 7
YOGA NARASIMHA EPURI
2020년 10월 29일
set(ax1.position,'Units','Normalized')
this snippet makes faster the code
추가 답변 (4개)
Eugene Paymurzov
2020년 6월 5일
편집: Eugene Paymurzov
2020년 6월 5일
댓글 수: 1
Adam Danz
2020년 6월 5일
Not all reported bugs are public.
To see a list of bugs you reported, go to your account page (requires that you're logged in).
Then click "Service Requests" under your profile avatar.
Eugene Paymurzov
2020년 6월 8일
댓글 수: 1
Adam Danz
2020년 6월 8일
My answer clearly explains the cause of the problem and it provides a solution. Your original question also continued to develop into other questions. The email you got is a reminder to accept answers that were helpful so you can think the volunteers who have give their time to you.
참고 항목
카테고리
Help Center 및 File Exchange에서 Graphics Object Programming에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!